我正在尝试制作一个图像,我将图例放在轴外。但我发现如果我在bbox_inches='tight'
方法中使用plt.savefig()
,则生成的图片不包含图例。最简单的工作示例如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl
x = np.arange(-5, 5, 0.1)
y1 = np.sin(x)
y2 = np.cos(x)
fig, ax1= plt.subplots(ncols=1, nrows=1, figsize=(10, 6))
ax1.plot(x, y1, label='sin(x)')
ax1.plot(x, y2, label='cos(x)')
handles, labels = ax1.get_legend_handles_labels()
plt.figlegend(handles, labels, loc='upper left', ncol=2, frameon=False,
bbox_to_anchor=(0.11, 0.95))
plt.savefig('test.jpg', bbox_inches='tight')
如果我在bbox_inches='tight'
方法中移除savefig()
。(如下所示),图例会出现在制作的图像中,但图像的四边有两个很大的空白区域。
是否有一种很好的方法可以保留图像的紧密布局并将图例保留在生成的图像中?
按照this post中的说明,我还尝试在bbox_extra_artists
方法中使用savefig()
参数,类似这样
legend = plt.figlegend(handles, labels, loc='lower left', ncol=2, frameon=True,
bbox_to_anchor=(0.12, 0.88))
plt.savefig('test.jpg', bbox_extra_artists=(legend,), bbox_inches='tight')
正如@Diziet Asahi和@mportanceOfBeingErnest指出的那样,如果我们使用ax.legend()
方法,一切正常。以下代码有效,
legend = ax1.legend(handles, labels, ncol=2, frameon=False,
loc='lower left', bbox_to_anchor=(-0.01, 1.2))
plt.savefig('test.jpg', bbox_inches='tight')
According to the Matplotlib developer,当我们使用严格布局时,似乎没有考虑fig.legend
方法生成的图例的错误。
答案 0 :(得分:2)
您可以使用图形轴之一的.legend()
方法创建图例。为了在图坐标中指定图例坐标,就像使用figlegend
一样,您可以使用bbox_transform
参数。
ax1.legend(handles, labels, loc='upper left', ncol=2, frameon=False,
bbox_to_anchor=(0.11, 0.95), bbox_transform=fig.transFigure)
答案 1 :(得分:1)