Matplotlib обрезает легенду, размещенную вне осей, игнорируя параметр bbox_extra_artists в savefig - PullRequest
0 голосов
/ 04 мая 2018

Этот вопрос похож на этот вопрос задан 6 лет назад . Однако их решение не совсем решает мою проблему; в отличие от их вопроса, я имею дело с несколькими легендами, некоторые из которых отсекаются.

Я пытаюсь создать фигуру, содержащую несколько легенд, которые находятся вне осей моего графика. Я следую инструкциям документации matplotlib для создания нескольких легенд , используя add_artist, чтобы добавить все, кроме последней легенды, к моим осям. Затем я использую параметр bbox_extra_artists в своем вызове savefig, как описано в предыдущем вопросе, чтобы включить все мои объекты легенды. Как видно из выходного изображения этого примера, более широкая легенда все еще обрезается с правой стороны.

Код, использованный для создания этого графика:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.gca()

for x in [0, 1, 2]:
    ax.bar(x+0.5, x+1, width=1, color=['red', 'blue', 'green'][x])

handle1 = plt.Line2D((0,1), (0,0), color='purple')
lgd1 = ax.legend([handle1], ['label1 is very long'], bbox_to_anchor=(1, 1))
ax.add_artist(lgd1)

handle2 = plt.Line2D((0,1), (0,0), color='orange')
lgd2 = ax.legend([handle2], ['label2'], bbox_to_anchor=(1, 0.9))

plt.savefig('output.png', bbox_extra_artists=(lgd1,lgd2), bbox_inches='tight')

Примечательно, что если я изменю порядок добавления легенд (сначала добавим более широкую легенду), проблема исчезнет, ​​и обе легенды будут видны, как показано здесь :

handle2 = plt.Line2D((0,1), (0,0), color='orange')
lgd2 = ax.legend([handle2], ['label2'], bbox_to_anchor=(1, 0.9))
ax.add_artist(lgd2)

handle1 = plt.Line2D((0,1), (0,0), color='purple')
lgd1 = ax.legend([handle1], ['label1 is very long'], bbox_to_anchor=(1, 1))

plt.savefig('output.png', bbox_extra_artists=(lgd1,lgd2), bbox_inches='tight')

Для моего реального проекта (который должен обрабатывать динамическое количество легенд), я заставил его выяснить, какая легенда "самая длинная", и всегда добавлять эту легенду последней, чтобы обойти эту проблему. Тем не менее, это выглядит грязно, и это не позволяет добавлять больше легенд на других сторонах фигуры (например, я не могу добавить легенду оси X под графиком без ее обрезки, так как можно добавить только одну легенду «последний»). «).

Это труднопреодолимая ошибка в matplotlib, или мне не хватает опрятного решения?

...