在IPython中调用pylab.savefig时不显示图像

177

我需要在文件中创建一个图形,而不在IPython笔记本中显示它。 我不清楚IPythonmatplotlib.pylab在这方面的交互。但是,当我调用pylab.savefig("test.png")时,当前的图形会被显示,并保存在test.png中。当自动创建大量绘图文件时,这通常是不希望发生的情况。或者在需要进行外部处理的中间文件的情况下。

不确定这是一个matplotlib还是IPython笔记本问题。


@staticfloat的答案对我非常有用,即使不在笔记本中使用JuliaLang通过matplotlib绘图时也有效;使用ioff - Vass
4个回答

251

这是一个关于matplotlib的问题,你可以通过使用不向用户显示的后端(例如“Agg”)来解决此问题:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

plt.plot([1,2,3])
plt.savefig('/tmp/test.png')

编辑:如果您不想失去显示图形的能力,请关闭交互模式,并且只有在准备好显示图形时才调用plt.show()

import matplotlib.pyplot as plt

# Turn interactive plotting off
plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('/tmp/test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
plt.figure()
plt.plot([1,3,2])
plt.savefig('/tmp/test1.png')

# Display all "open" (non-closed) figures
plt.show()

3
好的,但是我希望在 iPython 中保留内联绘图。如果完全切换后端,则您提出的建议可以很好地起作用。问题是如何允许内联绘图的一般情况下,保存图形时的例外情况(不显示内联)。按照您的建议,我尝试重新加载模块并暂时更改后端,但没有成功。有任何想法在 iPython notebook 会话中如何临时更改后端? - tnt
1
我已经更新了问题,讨论交互式绘图和close()show()命令,这应该解决你的问题。如你所发现的那样,动态更改后端是不支持的。 - staticfloat
3
非常感谢您的优秀反馈。看起来 plt.close(fig) 是我所需的关键命令。我仍然不清楚 ioff,因为它似乎并没有影响操作;但是,我可能漏掉了什么。再次感谢。 - tnt
2
我提供的配方是通用的;如果您不在ipython笔记本中工作,plt.ioff()很重要,以防止图形在屏幕上闪烁,因为在命令行ipython中,如果交互模式打开,则会立即绘制图形。关闭交互模式会延迟任何绘图的显示,直到plt.show()。由于您正在使用ipython笔记本,因此交互模式会被不同地处理。 - staticfloat
对我而言,仅使用matplotlib.use('Agg')就解决了问题。我的代码中根本不需要任何plt.show()plt.ioff() - Zhanwen Chen
1
如何在使用“'Agg'”后恢复到标准后端? - Gulzar

110
Great, I am always happy to assist you in translating text. What language pairs do you need help with?
%matplotlib inline
import pylab as plt

# It doesn't matter you add line below. You can even replace it by 'plt.ion()', but you will see no changes.
## plt.ioff()

# Create a new figure, plot into it, then close it so it never gets displayed
fig = plt.figure()
plt.plot([1,2,3])
plt.savefig('test0.png')
plt.close(fig)

# Create a new figure, plot into it, then don't close it so it does get displayed
fig2 = plt.figure()
plt.plot([1,3,2])
plt.savefig('test1.png')

如果你在iPython中运行这段代码,它会显示第二个图形,如果你在结尾添加plt.close(fig2),你将看不到任何内容。

总之,如果你使用plt.close(fig)关闭图形,它将不会被显示。


7
的确更好的解决方案!我在一个循环中生成并保存了许多图。使用 plt.ioff 后,会出现 RuntimeWarning: More than 20 figures have been opened... 的警告。使用 plt.close 解决了这个问题。 - Nagasaki45
2
只需在每个图的结尾处调用 plt.close() 而不是 plt.show(),它们就不会被显示出来。这是最好的解决方案,因为它不会改变任何全局行为,只需要一行代码即可。 - codeananda

2
只需要调用plt.close()而不是plt.show()
xs = [1,2,3]
ys = [1,4,9]
plt.plot(xs, ys)
# plt.show() # will show the plot
plt.close() # will close the plot

0

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