当前位置: 首页 > 知识库问答 >
问题:

matplotlib保存bbox_inches='紧'不忽略不可见的轴

宋涵忍
2023-03-14

当您在Matplotlib的Savefig()函数中设置bbox_inches=“紧密”时,它会尝试找到封装图形窗口中所有内容的最紧密边界框。不幸的是,最严格的边界框似乎包括不可见的轴。

例如,下面是一个代码段,其中设置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()忽略figure窗口中的不可见项?我提出的唯一解决方案是自己计算边界框,并显式地将bbox指定为savefig()。

如果重要的话,我在Mac OS X 10.8.5上运行Python 2.7.3下的Matplotlib 1.2.1。

共有2个答案

蒲昊
2023-03-14

谢谢你的帮助。我最初的问题是,“如何强制savefig()忽略figure窗口中的不可见项?”当我把fig_ax。设置_visible(False)然后savefig()忽略不可见轴。不幸的是,当我设置fig_ax时。设置“可见”(False)则放置在fig_ax中的任何艺术家也不可见。我回到了我发布的原始绘图,那里不存在fig\u ax

正如您在评论中所暗示的,我认为正确的解决方案是避免创建fig\u ax。我目前正在将注释和数据轴标签放置在默认地物对象fig中。这有点烦人,因为fig使用标准化的图形单位而不是mm单位,但我可以处理它。

费学
2023-03-14

backend\u库中的相关函数(由canvas.print\u figure调用,由figure.savefig调用以生成边界框)。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,即使轴中没有可见(或艺术家。get_visible()==False或简单透明)艺术家。

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

 类似资料:
  • 问题内容: 我目前使用如下所示的XML 我所坚持的是,在使用XStream时,我需要能够忽略出现的某些标签(在“ FavOS”上方的情况下),这些标签可能未知或将来会更改。有没有办法忽略所有与当前实现的不匹配的标签? (使用XStream 1.3.1) 问题答案: 由于我花了超过15分钟的时间才能找到此答案,因此我认为应该发布它。 这似乎会跳过不在您的对象中的xml项。

  • 这是我的东西 当我得到响应时,我看到 我的看起来像 问题 如何消除中的值?

  • 使用 PHPStorm,我试图忽略工作区.xml每次我尝试进行 git 提交时都会弹出该。 我的<代码>。gitignore看起来像: 因为在提交文件的某个时刻,我还执行了: ,然后提交删除,推送到一个裸存储库。 但是当我在项目中进行更改时,该文件会不断弹出。 知道我错过了什么吗?

  • 网上可能有数千篇关于ListView和ListAdapter回收过程的帖子,但到目前为止我还不能解决我的问题。 我有自定义的ListView行,并使用从远程服务器获取的数据填充行中的项目(TextView、ImageView等)。屏幕一次最多可以显示5行,如果有更多行,我必须滚动。问题是;适配器只存储和回收前5行的信息,即使我滚动查看第6行、第7行、第8行等,我也会在随机位置一次又一次地看到相同的

  • 我试图制作一个图像,我把图例放在轴的外面。但是我发现如果我在方法,生成的图像不包含图例。下面是一个简单的工作示例: 如果我删除在方法中。(如下所示),图例存在于生成的图像中,但是在图像的四边有两个很大的空白。 有没有一种好方法可以保留图像的紧凑布局,并在生成的图像中保留图例? 按照这篇文章中的说明,我还尝试在方法中使用参数,如下所示 正如@dizietasahi和@importanceofbein