У меня есть следующий сценарий:
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()
Результат
Проблема : я использую handletextpad
в легендах, и это потому, что мне нужно, чтобы точки и текст были очень близки. Однако последние два элемента во второй легенде - это не точки, а линии. Они занимают больше места, чем точки, и текст оказывается слишком близко.
Мне нужно сохранить это расстояние между текстом и точками, увеличивая расстояние между текстом и строками в той же легенде .
Я пробовал использовать handletextpad=[0.1, 0.5, 0.5]
и аналогичные стратегии, но мне не удалось установить отдельные значения handletextpad
.
Другой вариант - составить отдельные легенды, в частности, одну, состоящую только из строк. Это, однако, заставило бы меня вручную позиционировать любую легенду очень осторожно, и я бы предпочел не делать этого. Также (я не знаю, может ли это помочь), но я бы предпочел не заменять
plt.plot(x, y, linewidth = 0, markersize = 4)
на
plt.scatter(x, y)
.
За исключением этих двух оговорок, приветствуются все.