16

Как вынести легенду за пределы графика

13

У меня есть серия из 20 графиков (не субграфиков), которые нужно поместить в одну фигуру. Я хочу, чтобы легенда находилась за пределами графика. При этом я не хочу изменять масштаб осей, так как это уменьшает размер фигуры.

  1. Я хочу, чтобы легенда располагалась вне области графика (я хочу, чтобы легенда находилась с правой стороны от области графика).
  2. Есть ли способ уменьшить размер шрифта текста внутри легенды, чтобы размер легенды был меньше?

4 ответ(ов)

0

Краткий ответ: Включите перетаскивание для легенды и перемещайте её там, где вам нужно:

ax.legend().draggable()

Развернутый ответ: Если вы предпочитаете размещать легенду интерактивно или вручную, а не программно, вы можете включить режим перетаскивания для легенды, чтобы иметь возможность двигать её куда угодно. Посмотрите на следующий пример:

import matplotlib.pylab as plt
import numpy as np

# Определяем фигуру и получаем экземпляр осей
fig = plt.figure()
ax = fig.add_subplot(111)

# Строим данные
x = np.arange(-5, 6)
ax.plot(x, x*x, label='y = x^2')
ax.plot(x, x*x*x, label='y = x^3')

# Включаем перетаскивание для легенды
ax.legend().draggable()
plt.show()
0

Вы также можете попробовать использовать figlegend. С его помощью можно создать легенду, независимую от каких-либо объектов Axes. Однако вам может потребоваться создать несколько "пустых" объектов Path, чтобы убедиться, что форматирование для объектов передается корректно.

0

Вам может подойти следующий подход. Начнем с небольшого кода, взятого у Джо, который модифицирует ширину окна так, чтобы легенда автоматически помещалась справа от фигуры.

import matplotlib.pyplot as plt
import numpy as np

plt.ion()

x = np.arange(10)

fig = plt.figure()
ax = plt.subplot(111)

for i in range(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)

# Поместите легенду справа от текущей оси
leg = ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))

plt.draw()

# Получаем размеры оси.
box = ax.get_position()
xlocs = (box.x0, box.x1)
ylocs = (box.y0, box.y1)

# Получаем размер фигуры в дюймах и dpi.
w, h = fig.get_size_inches()
dpi = fig.get_dpi()

# Получаем размер легенды, рассчитываем новую ширину окна и изменяем размер фигуры.
legWidth = leg.get_window_extent().width
winWidthNew = w * dpi + legWidth
fig.set_size_inches(winWidthNew / dpi, h)

# Настраиваем размер окна, чтобы оно соответствовало фигуре.
mgr = plt.get_current_fig_manager()
mgr.window.wm_geometry("%ix%i" % (winWidthNew, mgr.window.winfo_height()))

# Изменяем масштаб оси, чтобы сохранить ее исходный размер.
factor = w * dpi / winWidthNew
x0 = xlocs[0] * factor
x1 = xlocs[1] * factor
width = box.width * factor
ax.set_position([x0, ylocs[0], x1 - x0, ylocs[1] - ylocs[0]])

plt.draw()

Этот код автоматически подгоняет размер окна для отображения легенды справа от графика. Надеюсь, это окажется полезным!

0

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

В приведённом ниже примере я создал четыре ряда и внизу разместил изображение с смещением для легенды (bbox_to_anchor). В верхней части оно не обрезается.

f = plt.figure()
ax = f.add_subplot(414)
lgd = ax.legend(loc='upper left', bbox_to_anchor=(0, 4), mode="expand", borderaxespad=0.3)
ax.autoscale_view()
plt.savefig(fig_name, format='svg', dpi=1200, bbox_extra_artists=(lgd,), bbox_inches='tight')

В этом коде bbox_to_anchor позволяет задать положение легенды вне основного графика, что предотвращает её обрезку. Не забудьте настроить bbox_inches на 'tight', чтобы сохранить все элементы на картинке.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь