这将在GUI中显示图形:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [1, 4, 9])
plt.show()

但我如何将图形保存到文件(例如foo.png)中?


当前回答

如果像我一样使用Spyder IDE,则必须禁用交互模式:

plt.ioff()

(此命令在科学启动时自动启动)

如果要再次启用,请使用:

plt.ion()

其他回答

如果像我一样使用Spyder IDE,则必须禁用交互模式:

plt.ioff()

(此命令在科学启动时自动启动)

如果要再次启用,请使用:

plt.ion()

您可以执行以下任一操作:

plt.show(hold=False)
plt.savefig('name.pdf')

记住在关闭GUI绘图之前让savefig完成。这样您可以提前看到图像。

或者,您可以使用plt.show()查看它然后关闭GUI并再次运行脚本,但这次将plt.show()替换为plt.savefig()。

或者,您可以使用

fig, ax = plt.figure(nrows=1, ncols=1)
plt.plot(...)
plt.show()
fig.savefig('out.pdf')

解决方案是:

pylab.savefig('foo.png')

刚刚在MatPlotLib文档中找到了解决此问题的链接:http://matplotlib.org/faq/howto_faq.html#generate-图像-无窗口外观

他们说,防止弹出图形的最简单方法是通过matplotib.use(<backend>)使用非交互式后端(例如Agg),例如:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')

我个人还是更喜欢使用plt.close(图),因为这样你就可以选择隐藏某些数字(在循环期间),但仍然可以显示循环后数据处理的数字。它可能比选择非交互式后端要慢——如果有人测试了它,那会很有趣。

UPDATE:对于Spyder,通常不能以这种方式设置后端(因为Spyder通常会提前加载matplotlib,从而阻止您使用matplotlib.use())。

相反,请使用plt.switch_backend('Agg'),或在Spyder prefs中关闭“enable support”,然后自己运行matplotlib.use('Agg')命令。

从这两个提示中:一、二

只是一个额外的注释,因为我还不能评论帖子。

如果您使用的是plt.savefig('myfig')或类似行,请确保在保存图像后添加plt.clf()。这是因为savefig不会关闭绘图,如果在没有plt.clf()的情况下添加到绘图,则会添加到上一个绘图。

你可能不会注意到你的情节是否与之前的情节相似,但如果你在循环中保存你的数字,情节将慢慢变得庞大,并使你的脚本变得非常缓慢。