Python 将打印保存到图像文件,而不是使用Matplotlib显示
我正在写一个快速而肮脏的脚本来动态生成情节。我使用以下代码(来自文档)作为起点:Python 将打印保存到图像文件,而不是使用Matplotlib显示,python,matplotlib,plot,Python,Matplotlib,Plot,我正在写一个快速而肮脏的脚本来动态生成情节。我使用以下代码(来自文档)作为起点: from pylab import figure, axes, pie, title, show # Make a square figure and axes figure(1, figsize=(6, 6)) ax = axes([0.1, 0.1, 0.8, 0.8]) labels = 'Frogs', 'Hogs', 'Dogs', 'Logs' fracs = [15, 30, 45, 10] e
from pylab import figure, axes, pie, title, show
# Make a square figure and axes
figure(1, figsize=(6, 6))
ax = axes([0.1, 0.1, 0.8, 0.8])
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
fracs = [15, 30, 45, 10]
explode = (0, 0.05, 0, 0)
pie(fracs, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True)
title('Raining Hogs and Dogs', bbox={'facecolor': '0.8', 'pad': 5})
show() # Actually, don't show, just save to foo.png
我不想在GUI上显示绘图,而是想将绘图保存到一个文件(比如foo.png),以便可以在批处理脚本中使用。如何做到这一点?解决方案是:
pylab.savefig('foo.png')
解决办法是:
pylab.savefig('foo.png')
虽然这个问题已经得到了回答,但我想在使用时添加一些有用的提示。文件格式可由扩展名指定:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
将分别给出光栅化或矢量化输出,这两种输出都可能有用。此外,您会发现pylab
在图像周围留下了大量的、通常不受欢迎的空白。您可以使用以下方法删除空白:
plt.savefig('foo.png', bbox_inches='tight')
虽然这个问题已经得到了回答,但我想在使用时添加一些有用的提示。文件格式可由扩展名指定:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
将分别给出光栅化或矢量化输出,这两种输出都可能有用。此外,您会发现pylab
在图像周围留下了大量的、通常不受欢迎的空白。您可以使用以下方法删除空白:
plt.savefig('foo.png', bbox_inches='tight')
如果您不喜欢“当前”图形的概念,请执行以下操作:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
如果您不喜欢“当前”图形的概念,请执行以下操作:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
正如其他人所说,
plt.savefig()
或fig1.savefig()
确实是保存图像的方法
然而,我发现在某些情况下,图形总是显示出来。(例如,Spyder具有plt.ion()
:interactive mode=On。)我通过使用plt.close(figure_object)
(请参见)强制关闭我的巨型循环中的图形窗口来解决此问题,因此在循环期间我没有一百万个打开的图形:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
如果需要,您应该能够稍后使用
fig.show()
(没有测试我自己)。正如其他人所说,plt.savefig()
或fig1.savefig()
确实是保存图像的方法
然而,我发现在某些情况下,图形总是显示出来。(例如,Spyder具有plt.ion()
:interactive mode=On。)我通过使用plt.close(figure_object)
(请参见)强制关闭我的巨型循环中的图形窗口来解决此问题,因此在循环期间我没有一百万个打开的图形:
import matplotlib.pyplot as plt
fig, ax = plt.subplots( nrows=1, ncols=1 ) # create figure & 1 axis
ax.plot([0,1,2], [10,20,3])
fig.savefig('path/to/save/image/to.png') # save the figure to file
plt.close(fig) # close the figure window
如果需要,您可以稍后使用
fig.show()
(没有测试我自己)。如果您像我一样使用Spyder IDE,您必须禁用交互式模式:
plt.ioff()
(此命令在科学启动时自动启动)
如果要再次启用,请使用:
plt.ion()
如果您像我一样使用Spyder IDE,则必须禁用以下交互模式:
plt.ioff()
(此命令在科学启动时自动启动)
如果要再次启用,请使用:
plt.ion()
刚刚在MatPlotLib文档中找到了这个链接,正好解决了这个问题:
他们说,防止图形弹出的最简单方法是使用非交互式后端(例如Agg),通过matplotib.use()
,例如:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
我个人仍然更喜欢使用plt.close(图)
,因为那时您可以选择隐藏某些图形(在循环期间),但仍然显示用于循环后数据处理的图形。这可能比选择一个非交互式的后端要慢——如果有人测试过的话会很有趣
更新:对于Spyder,通常不能以这种方式设置后端(因为Spyder通常会提前加载matplotlib,从而阻止您使用matplotlib.use()
)
相反,请使用plt.switch_backend('Agg')
,或关闭Spyder prefs中的“enable support”,然后自己运行matplotlib.use('Agg')
命令
从这两个提示中:,刚刚在MatPlotLib文档中找到了这个链接,正好解决了这个问题: 他们说,防止图形弹出的最简单方法是使用非交互式后端(例如Agg),通过
matplotib.use()
,例如:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
我个人仍然更喜欢使用plt.close(图)
,因为那时您可以选择隐藏某些图形(在循环期间),但仍然显示用于循环后数据处理的图形。这可能比选择一个非交互式的后端要慢——如果有人测试过的话会很有趣
更新:对于Spyder,通常不能以这种方式设置后端(因为Spyder通常会提前加载matplotlib,从而阻止您使用matplotlib.use()
)
相反,请使用plt.switch_backend('Agg')
,或关闭Spyder prefs中的“enable support”,然后自己运行matplotlib.use('Agg')
命令
根据以下两个提示:,解决方案:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')
如果要显示图像并保存图像,请使用:
%matplotlib inline
之后
导入matplotlib
解决方案:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
plt.figure()
ts.plot()
plt.savefig("foo.png", bbox_inches='tight')
如果要显示图像并保存图像,请使用:
%matplotlib inline
之后
导入matplotlib
我使用了以下方法:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
f.close()
plt.close()
我发现保存图形后使用plt.show非常重要,否则它将无法工作。我使用了以下方法:
import matplotlib.pyplot as plt
p1 = plt.plot(dates, temp, 'r-', label="Temperature (celsius)")
p2 = plt.plot(dates, psal, 'b-', label="Salinity (psu)")
plt.legend(loc='upper center', numpoints=1, bbox_to_anchor=(0.5, -0.05), ncol=2, fancybox=True, shadow=True)
plt.savefig('data.png')
plt.show()
f.close()
plt.close()
我发现保存图形后使用plt.show非常重要,否则它将无法工作。其他答案都是正确的。但是,我有时会发现我想稍后打开figure对象。例如,我可能希望更改标签大小、添加网格或进行其他处理。在一个完美的世界中,我只需重新运行生成绘图的代码,并调整设置。唉,世界并不完美。因此,除了保存为PDF或PNG外,我还添加了:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
这样,我可以稍后加载figure对象并操作设置
import matplotlib.pyplot as plt
plt.savefig("myfig.png")
import cv2
cv2.imwrite("myfig.png",image)
fig.savefig('plot.png') # save the plot, place the path you want to save the figure in quotation
plt.close(fig) # close the figure window