Этот вопрос похож на этот вопрос задан 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, или мне не хватает опрятного решения?