【问题标题】:pad_inches=0 and bbox_inches="tight" makes the plot smaller than declared figsizepad_inches=0 和 bbox_inches="tight" 使绘图小于声明的 figsize
【发布时间】:2013-04-08 13:59:52
【问题描述】:

我正在制作一个嵌入到乳胶中的出版质量图,我希望在大小和字体方面非常精确(以便文章中的字体与图中的字体大小相同)。为了防止绘图在乳胶中缩放,我希望它具有精确的大小,但我不能。这是我的代码:

import matplotlib.pyplot as plt
from matplotlib import rc, rcParams
from numpy import sin

rc('text', usetex=True)
rc('font', family='serif', serif='Computer Modern Roman', size=8)
rc('legend', fontsize=10)

width_in = 5
fig = plt.figure(1, figsize=(width_in, 2))
ax = fig.add_subplot(111)
ax.plot(range(0,100), sin(range(0,100)))

fig.tight_layout()
fig.savefig('test.eps', bbox_inches='tight', pad_inches=0)
plt.close()

问题在于 bbox_inches='tight' 和 pad_inches=0。添加这些选项使我的地块宽 4.76 英寸,而不是声明的 5 英寸。但我希望他们节省空间。那么如何解决呢?

编辑:嗯,答案建议删除bbox_inches='tight'pad_inches=0 并仅使用tight_layout()。然后图像大小合适,但周围仍有一些白色填充。我可以用fig.tight_layout(pad=0) 删除它,但是它移动到框内的图形标题看起来很难看。另一方面,我可以使用tight_layout(rect=[...]) 并获得所需的结果,但要获得正确的数字是一项手动工作——我不喜欢它。因此,目前我没有看到任何简单而通用的解决方案来解决我的问题。

【问题讨论】:

    标签: matplotlib plot


    【解决方案1】:

    您遇到的问题是bbox_inches='tight' 只是删除了图形周围的所有额外空白,在渲染后它实际上并没有重新排列图形中的任何内容。

    您可能需要调整传递给tight_layout (tutorial) 的参数以获得所需的效果。

    希望这能让你找到正确的方向。

    【讨论】:

    • 我对此有一个后续问题:我在默认图形 bbox 上方获得了文本,因此如果我直接保存它们,文本将被剪切。如果我使用 bbox_inches='tight',图形边距会被削减。有没有办法只在垂直方向上做 bbox_inches='tight' ?
    • 然后问一个新问题
    • 谢谢!我做到了,它就在这里:stackoverflow.com/questions/23532036/…
    • @max0r 请创建一个新答案
    【解决方案2】:

    我在为 LaTeX 制作 matplotlib 绘图时遇到同样的问题。由于我的地块不允许使用tight_layout,因此给出了this 警告,我最终使用了fig.subplots_adjust(bottom=bottom_pos, top=top_pos, left=left_pos, right=right_pos)。请参阅此tutorial。 它需要手动找到 bottom_pos 等的最佳值,但在我的情况下,它似乎是唯一可能在没有太多空白的情况下获取图像而不改变输出的图形大小。

    【讨论】:

      【解决方案3】:

      您的原始绘图周围必须有空格,否则 bbox_inches=tight 不会删除任何区域。我知道有两种解决方案:

      1. 简单的方法是使用tcaswell提到的tight_layout

      2. 更复杂但更可控的方法是避免使用fig.add_subplot(111),而是使用fig.add_axes(),这样您在定义轴实例时可以更加严格地确定轴的大小。然后,您可以调整轴的大小以根据需要占用尽可能多的图形区域,以保持 5" 图形区域。完成此操作后,我建议干脆不使用 bbox_inches 或将其设置为 None(默认)以避免不必要的裁剪。fig.add_axes() 需要一个 rect 参数作为其第一个参数,该参数由 [left_position, bottom_position, width, height] 组成,每个参数的范围从 0 到 1。

      编辑:再次阅读tight_layout 教程后,我意识到它几乎涵盖了所有内容。我没有意识到它能够轻松地保持轴实例的纵横比,即使图形的纵横比与轴实例的纵横比不同。在定义轴区域时,我倾向于尝试非常明确,因为我处理卫星图像并尝试将其保持为原始传感器分辨率或该传感器分辨率的某个因素,这需要更多控制。

      【讨论】:

        猜你喜欢
        • 2018-01-04
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2014-10-30
        • 1970-01-01
        • 2013-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多