gpt4 book ai didi

python - matplotlib savefig bbox_inches = 'tight' 不忽略不可见轴

转载 作者:太空狗 更新时间:2023-10-30 03:03:21 28 4
gpt4 key购买 nike

当您在 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)

产生:

Nice tight bounding box

保存的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)

生产

Loose bounding box

如何强制 savefig() 忽略图形窗口中的不可见项目?我想出的唯一解决方案是自己计算边界框并将 bbox 明确指定给 savefig()。

以防万一,我在 Mac OS X 10.8.5 上的 Python 2.7.3 下运行 Matplotlib 1.2.1。

最佳答案

backend_bases.py中的相关函数(canvas.print_figure调用,figure.savefig调用生成边界框) :

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 或简单透明)轴上的艺术家。

您观察到的边界框行为是正确的行为。

关于python - matplotlib savefig bbox_inches = 'tight' 不忽略不可见轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328610/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com