【发布时间】:2013-10-20 03:38:39
【问题描述】:
当您在 Matplotlib 的 savefig() 函数中设置 bbox_inches = 'tight' 时,它会尝试找到封装图形窗口中所有内容的最紧密边界框。不幸的是,最紧密的边界框似乎包含不可见的轴。
例如,这里是一个 sn-p,其中设置 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 为 savefig()。
以防万一,我在 Mac OS X 10.8.5 上的 Python 2.7.3 下运行 Matplotlib 1.2.1。
【问题讨论】:
-
我会指出轴是可见的,你只是让轴对象不可见。在保存图之前添加
fig_ax.patch.set_color('r')以查看此内容。 -
为什么要把注释放在单独的轴上?
-
@tcaswell 我刚刚尝试在
fig_ax.yaxis.set_visible(False)之后插入fig_ax.patch.set_color('r')并且pdf 看起来一样。还是)感谢你的建议。我将注释放在一组单独的轴上,以便注释可以延伸到数据轴之外,因此我可以以毫米单位而不是数据单位指定位置。也许有一种方法可以满足这些要求,而无需单独的一组轴... -
是的,
annotate将以各种单位进行定位。 matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.annotate -
啊,补丁没有显示,因为
frameon=False隐藏了它(对不起,我的错),但我的观点仍然成立。fig_ax.get_visble() == True和fig_ax.get_window_extent()将设置您的边界框
标签: python pdf matplotlib