matplotlib: разные значения handletextpad в одной легенде - PullRequest
1 голос
/ 19 июня 2020

У меня есть следующий сценарий:

fig = plt.figure()
fig.set_size_inches(8,7)

ax1 = fig.add_subplot(1,1,1)


### PLOT

for k in my_dict:

    x, y = my_dict[k][0], my_dict[k][1]
    ax1.plot(x, y, linewidth = 0, marker='o', markersize = 4)


X = np.logspace(0.3, 6.6)
ax1.plot(X, 2*X**(-2), linewidth = 2, c='k')

X = np.logspace(0.3, 7.7)
ax1.plot(X, 3*X**(-1.5), linewidth = 2, c='b')


ax1.set_xscale('log')
ax1.set_yscale('log')


## LEGEND


labels = ['$10^{-1} \, \\Delta_1^*$', '$\\Delta_1^*$',\
          '$10^{5/2} \, \\Delta_1^*$', '$10^3 \, \\Delta_1^*$',
         '$x^{-2}$', '$x^{-3/2}$']

curves = ax1.get_lines()
legend1 = ax1.legend([curves[0], curves[1], curves[2]],\
                     [labels[0], labels[1], labels[2]],\
                     loc=1, ncol=1, fancybox=False, shadow=False,\
                     framealpha=0.0, markerscale=2, fontsize=25, handletextpad=0.0)

legend2 = ax1.legend([curves[3], curves[4], curves[5]],\
                     [labels[3], labels[4], labels[5]],\
                     loc=3, ncol=1, fancybox=False, shadow=False,\
                     framealpha=0.0, markerscale=2, fontsize=25, handletextpad=0.0)




vp = legend1._legend_box._children[-1]._children[0]
for c in vp._children:
    c._children.reverse()
vp.align="right"


ax1.add_artist(legend1)
ax1.add_artist(legend2)


fig.tight_layout()
plt.show()

Результат enter image description here

Проблема : я использую handletextpad в легендах, и это потому, что мне нужно, чтобы точки и текст были очень близки. Однако последние два элемента во второй легенде - это не точки, а линии. Они занимают больше места, чем точки, и текст оказывается слишком близко.

Мне нужно сохранить это расстояние между текстом и точками, увеличивая расстояние между текстом и строками в той же легенде .

Я пробовал использовать handletextpad=[0.1, 0.5, 0.5] и аналогичные стратегии, но мне не удалось установить отдельные значения handletextpad.

Другой вариант - составить отдельные легенды, в частности, одну, состоящую только из строк. Это, однако, заставило бы меня вручную позиционировать любую легенду очень осторожно, и я бы предпочел не делать этого. Также (я не знаю, может ли это помочь), но я бы предпочел не заменять

plt.plot(x, y, linewidth = 0, markersize = 4)

на

plt.scatter(x, y).

За исключением этих двух оговорок, приветствуются все.

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