pad_inches = 0和bbox_inches =“tight”使得图小于声明的figsize

时间:2013-04-16 08:39:01

标签: matplotlib plot

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

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=[...])并获得所需的结果,但这是一个手动工作,以使数字正确 - 我不喜欢它。因此,目前我没有看到任何简单而通用的解决方案。

3 个答案:

答案 0 :(得分:19)

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

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

希望这能让你指出正确的方向。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

  2. 更复杂但更易控制的方法是避免使用fig.add_subplot(111)而是使用fig.add_axes(),这样可以让您在定义轴的大小时更加严格轴实例。然后,您可以调整轴的大小,以占用维持5“图形区域所需的图形区域。一旦完成此操作,我建议您不要使用bbox_inches或将其设置为无(默认值)以避免不必要的裁剪。fig.add_axes()需要rect参数作为其第一个参数,其中包含[left_position, bottom_position, width, height],每个参数的范围为0到1.

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