Перемещение и изменение размера легенды-box в matplotlib

Я создаю графики с помощью Matplotlib, которые я сохраняю как SVG, экспортирую .документ PDF. + pdf_tex использует Inkscape и включает .pdf_tex-файл в документе LaTeX.

это означает, что я могу вводить команды LaTeX в заголовках, легендах и т. д., давая образ такой plot

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

plot rendered using LaTeX

код для участка (как экспортировать в SVG не показан здесь, но может быть показан по запросу):

import numpy as np
x = np.linspace(0,1,100)
y = x**2

import matplotlib.pyplot as plt
plt.plot(x, y, label = '{footnotesize $y = x^2$}')
plt.legend(loc = 'best')
plt.show()

проблема в том, как вы можете видеть, что выравнивание и размер поля вокруг легенды-это неправильно. Это связано с тем, что размер текста метки изменяется, когда изображение передается через Inkscape + pdflatex (потому что footnotesize etc. исчезает, и размер шрифта меняется).

я понял, что могу выбрать размещение этикетки либо

plt.label(loc = 'upper right')

или если я хочу больше контроля, я могу использовать

plt.label(bbox_to_anchor = [0.5, 0.2])

но я не нашел никакого способа сделать коробку вокруг этикетки меньше. Возможно ли это?

альтернативой тому, чтобы сделать коробку меньше, является удаление контура коробки, используя что-то вроде

legend = plt.legend()
legend.get_frame().set_edgecolor('1.0')

а затем переместите ярлык туда, где я его хочу. В этом случае я хотел бы иметь возможность установить размещение метки, сначала разрешив python / matplotlib поместите его с помощью

plt.label(loc = 'upper right')

а затем, например, переместив его немного вправо. Возможно ли это? Я пробовал использовать get_bbox_to_anchor() и set_bbox_to_anchor(), но, похоже, не может заставить его работать.

2 ответов


вы можете перемещать легенду после ее автоматического размещения, рисуя ее, а затем получая позицию bbox. Вот пример:

import matplotlib.pyplot as plt
import numpy as np

# Plot data
x = np.linspace(0,1,100)
y = x**2
fig = plt.figure()
ax = fig.add_subplot(221) #small subplot to show how the legend has moved. 

# Create legend
plt.plot(x, y, label = '{\footnotesize $y = x^2$}')
leg = plt.legend( loc = 'upper right')

plt.draw() # Draw the figure so you can find the positon of the legend. 

# Get the bounding box of the original legend
bb = leg.get_bbox_to_anchor().inverse_transformed(ax.transAxes)

# Change to location of the legend. 
xOffset = 1.5
bb.x0 += xOffset
bb.x1 += xOffset
leg.set_bbox_to_anchor(bb, transform = ax.transAxes)


# Update the plot
plt.show()

legend moved after first drawing


можно использовать bbox_to_anchor и bbox_transform параметры, которые помогут вам установить якорь для вашей легенды:

ax = plt.gca()
plt.legend(bbox_to_anchor=(1.1, 1.1), bbox_transform=ax.transAxes)

отметим, что (1.1, 1.1) находятся в координатах осей в этом примере. Если вы хотите использовать координаты данных, вы должны использовать .