Matplotlib切断传说中放置的外轴,忽略savefig

时间:2018-05-04 12:40:32

标签: python matplotlib legend

此问题与this one asked 6 years ago类似。但是,他们的解决方案并没有完全解决我的问题;与他们的问题不同,我正在处理多个传说,其中一些正在被切断。

我正在尝试创建一个包含多个图例的图形,这些图例位于图表的轴之外。我正在关注the matplotlib documentation's instructions for creating multiple legends,使用add_artist将最后一个图例添加到我的轴上。然后我使用上述问题中描述的bbox_extra_artists调用中的savefig参数来包含我的所有图例对象。 As seen in this example output image, the wider legend still gets cut off on the right side.

用于生成此图的代码:

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')

值得注意的是,如果我更改添加图例的顺序(首先添加更宽的图例),the problem goes away and both legends are visible as seen here

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轴图例而不会被切断,因为只能添加一个图例“last “)。

这是matplotlib中一个棘手的错误,还是我缺少一个整洁的解决方案?

0 个答案:

没有答案