Строка с одинаковым количеством символов занимает разное пространство в легенде matplotlib? - PullRequest
0 голосов
/ 08 мая 2020

У меня странная проблема с форматированной строкой в ​​Matplotlib. Я хочу, чтобы строковая часть в кортеже была выровнена по левому краю в легенде, а числа по правому краю, а также все метки легенды выровнены соответственно.

Поэтому я определил максимальную длину = 17 для строки и попытался отформатировать его с помощью следующего кода. Как видите, фактическая длина строки метки кажется равной 17, однако каким-то образом строки занимают разное количество места в легенде. В чем причина этого и как добиться выравнивания меток?

import matplotlib.pyplot as plt
import numpy as np

fig, ax = plt.subplots()

l=[('string1', 1), ('string200', 10.5), ('str3', 12.5)]

x=[1,2,3]
y=[1,2,3]

for tup in l:
    s_label='{0:<10s}{1:>7s}'.format(tup[0],str(tup[1]))
    print(len(s_label))
    ax.plot(x, np.add(y,tup[1]), label=s_label)

ax.legend()
fig.show()

1 Ответ

1 голос
/ 08 мая 2020

Если вам действительно нужен шрифт, в котором все символы имеют одинаковую длину, вы можете установить моноширинный шрифт. Это похоже на шрифт старой пишущей машинки.

В целом пропорциональные шрифты намного легче читать. Ширина символов пропорциональна: «i» занимает меньше места, чем «m» или «W».

ax.legend(prop={'family': 'monospace'}

Альтернативой тому, что вы хотите достичь sh, может быть создание 3 легенд. записей больше и используйте 2 столбца для легенды. Легенда состоит из комбинации ручки (цветная линия) и метки. Для сопровождения дополнительных меток вы можете создать фиктивные ручки.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import patches

fig, ax = plt.subplots()

l = [('string1', 1), ('string200', 10.5), ('str3', 12.5)]
x = [1, 2, 3]
y = [1, 2, 3]
for tup in l:
    ax.plot(x, np.add(y, tup[1]), label=tup[0])

empty_handle = patches.Rectangle((0, 0), 1, 1, fill=False, edgecolor='none', visible=False)
handles, labels = ax.get_legend_handles_labels()
handles += [empty_handle for tup in l]
labels += [lval for lstr, lval in l]
ax.legend(handles, labels, ncol=2)
plt.show()

На графике показаны два варианта легенды:

plot with legends

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...