调用pylab.savefig在ipython中不显示


111

我需要在文件中创建图形,而不在IPython Notebook中显示它。我不是之间的相互作用明确IPython,并matplotlib.pylab在这方面。但是,当我调用pylab.savefig("test.png")当前图形时,除了保存在中外,还会显示get test.png。当自动创建大量绘图文件时,这通常是不希望的。或者在需要一个中间文件供其他应用进行外部处理的情况下。

不知道这是一个matplotlibIPython笔记本电脑的问题。


@staticfloat的答案对我也有效,即使不在笔记本电脑中,以及通过JuliaLang使用matplotlib时也是如此。使用ioff
Vass

Answers:


173

这是一个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()

2
好的-但是,我通常希望在iPython中保留内联绘图。如果对后端进行完全切换,则您建议的方法效果很好。问题是您如何考虑到在线绘图的一般情况以及保存数字的特殊情况(不显示在线)。根据您的建议,我尝试重新加载模块并临时更改后端,但没有成功。关于如何在iPython Notebook会话中临时更改后端的任何想法?
tnt

1
我已经更新了有关交互式绘图和close()and show()命令的问题,该问题应该可以解决您的问题。如您所知,不支持即时更改后端。
staticfloat 2013年

3
感谢您的出色反馈。看来plt.close(fig)是我需要的关键命令。我仍然不清楚ioff,因为它似乎并没有影响手术。但是,我可能会丢失一些东西。再次感谢。
tnt

1
我给的食谱很一般。如果您不在ipython笔记本电脑上工作,则plt.ioff()对于阻止图形在屏幕上闪烁是很重要的,因为plt.plot()如果在交互式模式下打开,则在命令行中会立即绘制ipython图形。关闭交互模式会将所有绘图的显示延迟到plt.show()。由于您使用的是ipython笔记本,因此对交互模式的处理有所不同。
staticfloat 2013年

对我而言,matplotlib.use('Agg')仅此而已。我并不需要任何plt.show()plt.ioff()所有在我的代码。
陈占文

67

我们不需要plt.ioff()plt.show()(如果使用%matplotlib inline)。您可以不使用而测试上述代码plt.ioff()plt.close()具有至关重要的作用。试试这个:

%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),则不会显示。


5
确实更好的解决方案!我生成并保存许多图。随着plt.ioff我得到RuntimeWarning: More than 20 figures have been opened...plt.close解决了。
Nagasaki45年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.