Моя легенда matplotlib.pyplot обрезается - PullRequest
29 голосов
/ 11 марта 2012

Я пытаюсь создать сюжет с легендой сбоку, используя matplotlib. Я вижу, что сюжет создается, но границы изображения не позволяют отображать всю легенду.

lines = []
ax = plt.subplot(111)
for filename in args:
    lines.append(plt.plot(y_axis, x_axis, colors[colorcycle], linestyle='steps-pre', label=filename))
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

Это производит: enter image description here

Ответы [ 4 ]

28 голосов
/ 17 февраля 2017

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

Новая функция matplotlib: жесткая ограничительная рамка

Если вас интересует выходной файл plt.savefig: в этом случае флаг bbox_inches='tight' - ваш друг!

import matplotlib.pyplot as plt

fig = plt.figure(1)
plt.plot([1, 2, 3], [1, 0, 1], label='A')
plt.plot([1, 2, 3], [1, 2, 2], label='B')
plt.legend(loc='center left', bbox_to_anchor=(1, 0))

fig.savefig('samplefigure', bbox_inches='tight')

Output file: samplefigure.png

Я хочу сослаться также на более подробный ответ: Перемещение легенды matplotlib за пределы оси делает ее обрезкой по фигуре

Преимущества

  • Нет необходимости настраивать фактические данные / изображение.
  • Он совместим с plt.subplots так же, как и другие,
  • Это относится, по крайней мере, к наиболее часто используемым выходным файлам, например, png, pdf.
19 голосов
/ 11 марта 2012

Как указал Адам, вам нужно освободить место на стороне вашего графика. Если вы хотите точно настроить необходимое пространство, вы можете посмотреть на add_axes метод matplotlib.pyplot.artist.

Ниже приведен быстрый пример:

import matplotlib.pyplot as plt
import numpy as np

# some data
x = np.arange(0, 10, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)

# plot of the data
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.6, 0.75])
ax.plot(x, y1,'-k', lw=2, label='black sin(x)')
ax.plot(x, y2,'-r', lw=2, label='red cos(x)')
ax.set_xlabel('x', size=22)
ax.set_ylabel('y', size=22)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

plt.show()

и полученное изображение: image

6 голосов
/ 10 января 2013

Вот еще один способ создания пространства (сокращение оси):

# get the current axis
ax = plt.gca()
# Shink current axis by 20%
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.8, box.height])

, где 0,8 масштабирует ширину оси на 20%. На моей машине win7 64 коэффициент больше 1 освободит место для легенды, если она находится за пределами сюжета.

На этот код ссылались с: Как убрать легенду из сюжета

1 голос
/ 11 марта 2012

Редактировать: @gcalmettes опубликовано лучший ответ .
Его решение, вероятно, следует использовать вместо метода, показанного ниже.
Тем не менее, я оставлю это, поскольку иногда это помогает увидеть разные способы ведения дел.


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

import matplotlib.pyplot as plt
ax = plt.subplot(121) # <- with 2 we tell mpl to make room for an extra subplot
ax.plot([1,2,3], color='red', label='thin red line')
ax.plot([1.5,2.5,3.5], color='blue', label='thin blue line')
ax.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.show()

Производит:

enter image description here

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