在 ipython 中调用 pylab.savefig 而不显示

Posted

技术标签:

【中文标题】在 ipython 中调用 pylab.savefig 而不显示【英文标题】:Calling pylab.savefig without display in ipython 【发布时间】:2013-03-20 17:55:31 【问题描述】:

我需要在文件中创建一个图形而不在 IPython 笔记本中显示它。我不清楚IPythonmatplotlib.pylab在这方面的互动。但是,当我调用pylab.savefig("test.png") 时,除了保存在test.png 中之外,还会显示当前图形。在自动创建大量绘图文件时,这通常是不可取的。或者在需要由另一个应用程序进行外部处理的中间文件的情况。

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

【问题讨论】:

@staticfloat 的答案对我有用,即使不在笔记本中,也可以通过 JuliaLang 使用 matplotlib;使用ioff 【参考方案1】:

这是一个 matplotlib 问题,您可以通过使用不向用户显示的后端来解决这个问题,例如'聚合':

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

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

编辑:如果您不想失去显示绘图的能力,请关闭Interactive Mode,仅在您准备好显示绘图时调用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()

【讨论】:

好的 - 但是,我想通常在 iPython 中保留内联绘图。如果在后端进行完全切换,您的建议可以正常工作。问题是您如何允许内联绘图的一般情况与保存数字的例外情况(不显示内联)。根据您的建议,我尝试重新加载模块并暂时更改后端但没有成功。关于如何在 iPython 笔记本会话中临时更改后端的任何想法? 我已经更新了关于交互式绘图和close()show() 命令的问题,这应该可以解决您的问题。正如您所发现的,不支持即时更改后端。 感谢您的出色反馈。看来 plt.close(fig) 是我需要的关键命令。我仍然不清楚ioff,因为它似乎不会影响操作;但是,我可能遗漏了一些东西。再次感谢。 我给的食谱是通用的;如果您不在 ipython 笔记本中工作,plt.ioff() 对于阻止数字在屏幕上和屏幕外闪烁很重要,因为在命令行中,一旦您调用plt.plot(),如果交互模式打开,ipython 数字就会被绘制出来.关闭交互模式会延迟显示任何绘图,直到plt.show()。因为你使用的是ipython notebook,所以交互模式的处理方式不同。 对我来说,matplotlib.use('Agg') 就成功了。我的代码中根本不需要任何plt.show()plt.ioff()【参考方案2】:

我们不需要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)关闭图,就不会显示了。

【讨论】:

确实是更好的解决方案!我在一个循环中生成并保存了许多图。使用plt.ioff 我得到RuntimeWarning: More than 20 figures have been opened...plt.close 解决了。

以上是关于在 ipython 中调用 pylab.savefig 而不显示的主要内容,如果未能解决你的问题,请参考以下文章

从 ipython 导入

pyspark - 错误仅出现在 IPython 中,但不在 vanila python 中

当emacs尝试连接到ipython / jupyter服务器时,ein失败

如何清除ipython中的变量?

ipython matplotlib

在 iPython notebook 中调试的正确方法是啥?