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