Подтвердить что ты не робот

Как разместить и выровнять легенду фигуры matplotlib?

У меня есть фигура с двумя подзаголовками как 2 строки и 1 столбец. Я могу добавить красивую фигуру с

fig.legend((l1, l2), ['2011', '2012'], loc="lower center", 
           ncol=2, fancybox=True, shadow=True, prop={'size':'small'})

Однако эта легенда расположена в центре фигуры, а не ниже центра осей , поскольку я хотел бы иметь ее. Теперь я могу получить координаты осей с помощью

axbox = ax[1].get_position()

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

fig.legend(..., loc=(axbox.x0+0.5*axbox.width, axbox.y0-0.08), ...)

Это работает кроме, что легенда выровнена влево, так что loc указывает левый край/угол окна легенды, а не центр. Я искал ключевые слова, такие как align, horizontalalignment и т.д., Но не смог найти их. Я также попытался получить "положение легенды", но в легенде нет метода * get_position() *. Я читал о * bbox_to_anchor *, но не могу понять, когда применяется к легенде фигуры. Это похоже на легенды осей.

Или: следует ли вместо этого использовать легенду смещенных осей? Но почему, почему в первую очередь есть легенды фигур? И как-то должно быть возможно "выровнять по центру" легенду фигуры, потому что loc = "нижний центр" тоже делает это.

Спасибо за любую помощь,

Martin

4b9b3361

Ответ 1

В этом случае вы можете использовать оси для методов legend. В любом случае ключ bbox_to_anchor является ключом. Как вы уже заметили, bbox_to_anchor указывает кортеж координат (или прямоугольник) для размещения легенды. Когда вы используете bbox_to_anchor, подумайте о location kwarg как управлении горизонтальным и вертикальным выравниванием.

Различие заключается только в том, интерпретируется ли кортеж координат как оси или координаты фигур.

В качестве примера использования легенды фигуры:

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

x = np.linspace(0, np.pi, 100)

line1, = ax1.plot(x, np.cos(3*x), color='red')
line2, = ax2.plot(x, np.sin(4*x), color='green')

# The key to the position is bbox_to_anchor: Place it at x=0.5, y=0.5
# in figure coordinates.
# "center" is basically saying center horizontal alignment and 
# center vertical alignment in this case
fig.legend([line1, line2], ['yep', 'nope'], bbox_to_anchor=[0.5, 0.5], 
           loc='center', ncol=2)

plt.show()

enter image description here

В качестве примера использования метода axes попробуйте что-то вроде этого:

import numpy as np
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

x = np.linspace(0, np.pi, 100)

line1, = ax1.plot(x, np.cos(3*x), color='red')
line2, = ax2.plot(x, np.sin(4*x), color='green')

# The key to the position is bbox_to_anchor: Place it at x=0.5, y=0
# in axes coordinates.
# "upper center" is basically saying center horizontal alignment and 
# top vertical alignment in this case
ax1.legend([line1, line2], ['yep', 'nope'], bbox_to_anchor=[0.5, 0], 
           loc='upper center', ncol=2, borderaxespad=0.25)

plt.show()

enter image description here