我不知道你为什么会受到其他人的抨击。您的问题很清楚,但解决方案却绝非如此。我在谷歌的前两页上找不到任何解释轴的过程的东西,我确切地知道我在找什么。
无论如何,图形和坐标轴都有一个补丁属性,即构成背景的矩形。因此,设置图形框架非常简单:
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1)
# add a bit more breathing room around the axes for the frames
fig.subplots_adjust(top=0.85, bottom=0.15, left=0.2, hspace=0.8)
fig.patch.set_linewidth(10)
fig.patch.set_edgecolor('cornflowerblue')
# When saving the figure, the figure patch parameters are overwritten (WTF?).
# Hence we need to specify them again in the save command.
fig.savefig('test.png', edgecolor=fig.get_edgecolor())
现在,斧头更难破解了。我们可以使用与图相同的方法(我认为@jody-klymak 建议),但是,补丁仅对应于轴范围内的区域,即它不包括刻度标签、轴标签、也不是标题。
但是,axes 有一个get_tightbbox 方法,这正是我们所追求的。但是,使用它也有一些问题,如代码 cmets 中所述。
# We want to use axis.get_tightbbox to determine the axis dimensions including all
# decorators, i.e. tick labels, axis labels, etc.
# However, get_tightbox requires the figure renderer, which is not initialized
# until the figure is drawn.
plt.ion()
fig.canvas.draw()
for ii, ax in enumerate(axes):
ax.set_title(f'Title {ii+1}')
ax.set_ylabel(f'Y-Label {ii+1}')
ax.set_xlabel(f'X-Label {ii+1}')
bbox = ax.get_tightbbox(fig.canvas.renderer)
x0, y0, width, height = bbox.transformed(fig.transFigure.inverted()).bounds
# slightly increase the very tight bounds:
xpad = 0.05 * width
ypad = 0.05 * height
fig.add_artist(plt.Rectangle((x0-xpad, y0-ypad), width+2*xpad, height+2*ypad, edgecolor='red', linewidth=3, fill=False))
fig.savefig('test2.png', edgecolor=fig.get_edgecolor())
plt.show()