在 ipython 中调用 pylab.savefig 而不显示
Posted
技术标签:
【中文标题】在 ipython 中调用 pylab.savefig 而不显示【英文标题】:Calling pylab.savefig without display in ipython 【发布时间】:2013-03-20 17:55:31 【问题描述】:我需要在文件中创建一个图形而不在 IPython 笔记本中显示它。我不清楚IPython
和matplotlib.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 而不显示的主要内容,如果未能解决你的问题,请参考以下文章
pyspark - 错误仅出现在 IPython 中,但不在 vanila python 中