Matplotlib: 从iPython笔记本中将图保存为文件

42
我正在尝试从iPython笔记本中保存一个Matplotlib图形文件。
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([1,1,1,1])
ax.plot([1,2])

fig.savefig('test.png')

在 iPython 笔记本中的内嵌视图看起来不错:

iPython笔记本中的内嵌图表


但是文件'test.png'几乎是空的。看起来绘图被移动到右上角,你可以看到刻度标签 '1.0' 和 '0.0' 在角落里。

test.png

我该如何从 iPython 笔记本中生成一个看起来像内嵌视图的文件呢?


2个回答

41

问题已解决:在savefig中添加'bbox_inches='tight'参数。

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([1,1,1,1])
plt.plot([1,2])

savefig('test.png', bbox_inches='tight')

我不太理解这里正在发生什么,但是这个文件现在看起来像是iPython笔记本的内联文件。耶!


但这根本不应该发生,所以找出你的问题仍然是值得的。 - Rutger Kassies
好的观点。这是关于“bbox_inches”的文档所说的:“以英寸为单位的边界框。仅保存图形的给定部分。如果是'tight',则尝试找出图形的紧凑边界框。”我有点不理解。 - Martin Preusse
正常情况下,轴周围通常有一个非常宽的白色边框,“tight”试图将其最小化。我认为这与您的问题没有真正关系。但是只有使用“tight”,才能确定正确的“图形区域”,但这并不能告诉我为什么一开始就出错了。 - Rutger Kassies
我也一样 :) 我目前发现的是,当我只执行'plt.plot([1,2]) plt.savefig('file.png')'时它可以工作,而不定义fig = plt.figure()和ax = fig.add_axes()。所以我认为这与图形或轴上的设置有关。这也不是iPython或笔记本问题。在iPython控制台和普通Python脚本中都有相同的行为。 - Martin Preusse

6
实际上,savefig 正在正常工作。当您调用 add_axes 时,您的列表指定一个矩形:[left, bottom, width, height]。由于图的两个轴从左下角的原点到1,您正在从图的最右上方开始制作宽度和高度为1的矩形。您可能希望使用 ax = fig.add_axes([0,0,1,1])

我不确定内联绘图为什么不尊重您放置轴的位置。如果我必须猜测,我会说内联后端自动计算出外接框并根据其放置内联图。


当我执行"ax = fig.add_axes([0,0,1,1])"时,实际轴之外的所有内容都被裁剪掉了。当我使用"ax = fig.add_axes([0.1,0.1,1,1])"将所有内容向上移动时,绘图的顶部和右侧部分会丢失。即使与'figsize'结合使用,仍然会有一些部分被裁剪掉。通过使用"bbox_inches='tight'",所有内容都能够被正确放置。我真的不明白每个数字代表什么,文档也没有提供帮助。 - Martin Preusse
通常情况下,你不应该使用.make_axes来创建自己的坐标轴;你应该让Matplotlib自己处理。你的例子可以用plt.plot([1,2]); plt.savefig('test.png')来完成。手动添加坐标轴是一件高级的事情,只有在需要精确放置坐标轴时才需要这样做;然而,在大多数情况下,你应该让Matplotlib自己处理,并在出现问题时使用plt.tight_layout() - tbekolay
在实际案例中,我使用 'imshow',而我发现的所有示例都使用轴。奇怪的是,我认为我需要理解这种绘图逻辑;) - Martin Preusse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接