当你在Matplotlib的savefig()函数中设置bbox_inches ='tight'时,它会尝试找到封装图窗口中所有内容的最紧密的边界框。不幸的是,最紧的边界框似乎包括不可见的轴。
例如,以下是设置bbox_inches ='tight'的代码片段:
import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test1.pdf', bbox_inches = 'tight', pad_inches = 0)
产生:
保存的pdf的边界对应于内容的边界。这很好,除了我喜欢使用一组不可见的图形轴来放置注释。如果不可见轴延伸超出可见内容的边界,则pdf边界大于可见内容。例如:
import matplotlib.pylab as plt
fig = plt.figure(figsize = (5,5))
fig_ax = fig.add_axes([0, 0, 1, 1], frame_on = False)
fig_ax.xaxis.set_visible(False)
fig_ax.yaxis.set_visible(False)
data_ax = fig.add_axes([0.2, 0.2, 0.6, 0.6])
data_ax.plot([1,2], [1,2])
plt.savefig('Test2.pdf', bbox_inches = 'tight', pad_inches = 0)
制造
如何强制savefig()忽略图窗口中的不可见项?我提出的唯一解决方案是自己计算边界框并明确指定bbox to savefig()。
如果重要,我在Mac OS X 10.8.5上的Python 2.7.3下运行Matplotlib 1.2.1。
答案 0 :(得分:3)
canvas.print_figure
中由figure.savefig
调用以生成边界框的相关函数(由backend_bases.py
调用):
def get_tightbbox(self, renderer):
"""
Return a (tight) bounding box of the figure in inches.
It only accounts axes title, axis labels, and axis
ticklabels. Needs improvement.
"""
bb = []
for ax in self.axes:
if ax.get_visible():
bb.append(ax.get_tightbbox(renderer))
_bbox = Bbox.union([b for b in bb if b.width != 0 or b.height != 0])
bbox_inches = TransformedBbox(_bbox,
Affine2D().scale(1. / self.dpi))
return bbox_inches
决定轴是否“可见”的唯一考虑因素是ax.get_visible()
是否返回true,即使轴中没有可见(artist.get_visible() == False
或简单透明)艺术家。
您观察到的边界框行为是正确的行为。
答案 1 :(得分:1)
tcaswell,谢谢你的帮助。我原来的问题是,“我如何强制savefig()忽略图窗口中的不可见项?”当我放fig_ax.set_visible(False)
然后savefig()
忽略不可见的轴。不幸的是,当我设置fig_ax.set_visible(False)
时,任何放在fig_ax中的艺术家也是不可见的。我回到我发布的原始情节,其中fig_ax
不存在。
正如您在评论中暗示的那样,我认为正确的解决方案是避免创建fig_ax
。我目前正在将注释和数据轴标签放在默认的图形对象fig
中。这有点烦人,因为fig
使用标准化的数字单位而不是mm单位,但我可以处理它。