41

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

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

4

3 回答 3

34

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

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

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

于 2013-04-16T13:54:24.497 回答
4

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

于 2017-04-27T13:04:23.530 回答
1

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

  1. 简单的方法是使用tight_layouttcaswell 提到的。

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

于 2013-04-16T19:08:45.143 回答