将绘图保存到图像文件,而不是使用Matplotlib显示它

这将在GUI中显示图形:

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

但是如何将数字保存到文件中(例如foo.png)?

2492603 次浏览

解决办法是:

pylab.savefig('foo.png')

使用#0时,文件格式可以由扩展名指定:

from matplotlib import pyplot as plt
plt.savefig('foo.png')plt.savefig('foo.pdf')

分别给出光栅化或矢量化输出。此外,有时图像周围有不希望的空白,可以使用以下方法删除:

plt.savefig('foo.png', bbox_inches='tight')

请注意,如果显示绘图,plt.show()应跟随plt.savefig();否则,文件图像将为空。

如果您不喜欢“当前”数字的概念,请执行以下操作:

import matplotlib.image as mpimg
img = mpimg.imread("src.png")mpimg.imsave("out.png", img)

正如其他人所说,plt.savefig()fig1.savefig()确实是保存图像的方法。

但是,我发现在某些情况下数字总是显示.(例如,Spyder具有plt.ion():交互模式=On.)我通过以下方式解决这个问题强制图形窗口关闭:

plt.close(figure_object)

(参见留档)。这样,在大循环期间我就没有一百万个开放数字。示例用法:

import matplotlib.pyplot as pltfig, ax = plt.subplots( nrows=1, ncols=1 )  # create figure & 1 axisax.plot([0,1,2], [10,20,3])fig.savefig('path/to/save/image/to.png')   # save the figure to fileplt.close(fig)    # close the figure window

如果需要,您应该能够稍后使用fig.show()重新打开该图(没有测试自己)。

import datetimeimport numpy as npfrom matplotlib.backends.backend_pdf import PdfPagesimport matplotlib.pyplot as plt
# Create the PdfPages object to which we will save the pages:# The with statement makes sure that the PdfPages object is closed properly at# the end of the block, even if an Exception occurs.with PdfPages('multipage_pdf.pdf') as pdf:plt.figure(figsize=(3, 3))plt.plot(range(7), [3, 1, 4, 1, 5, 9, 2], 'r-o')plt.title('Page One')pdf.savefig()  # saves the current figure into a pdf pageplt.close()
plt.rc('text', usetex=True)plt.figure(figsize=(8, 6))x = np.arange(0, 5, 0.1)plt.plot(x, np.sin(x), 'b-')plt.title('Page Two')pdf.savefig()plt.close()
plt.rc('text', usetex=False)fig = plt.figure(figsize=(4, 5))plt.plot(x, x*x, 'ko')plt.title('Page Three')pdf.savefig(fig)  # or you can pass a Figure object to pdf.savefigplt.close()
# We can also set the file's metadata via the PdfPages object:d = pdf.infodict()d['Title'] = 'Multipage PDF Example'd['Author'] = u'Jouni K. Sepp\xe4nen'd['Subject'] = 'How to create a multipage pdf file and set its metadata'd['Keywords'] = 'PdfPages multipage keywords author title subject'd['CreationDate'] = datetime.datetime(2009, 11, 13)d['ModDate'] = datetime.datetime.today()

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

plt.ioff()

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

如果您想再次启用它,请使用:

plt.ion()

刚刚在MatPlotLib留档上找到这个链接,正好解决了这个问题:http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear

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

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

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

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

相反,使用plt.switch_backend('Agg'),或者在Spyder prefs中关闭“启用支持”并自己运行matplotlib.use('Agg')命令。

从这两个提示:一个两个

解决方法:

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlibmatplotlib.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

之后import 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()plt.close()

我发现保存数字后使用plt.show非常重要,否则它将无法工作。

其他答案都是正确的。然而,我有时发现我想稍后打开对象这个数字。例如,我可能想更改标签大小,添加网格或进行其他处理。在一个完美的世界里,我只需重新运行生成图表的代码,并调整设置。唉,世界并不完美。因此,除了保存为PDF或PNG,我补充道:

with open('some_file.pkl', "wb") as fp:pickle.dump(fig, fp, protocol=4)

像这样,我可以稍后加载图形对象并随心所欲地操作设置。

我还使用堆栈中每个函数/方法的源代码和locals()字典编写了堆栈,以便我稍后可以准确地说出生成该图的原因。

注意:要小心,因为有时这种方法会生成巨大的文件。

在使用plot()和其他函数创建您想要的内容后,您可以使用这样的子句在绘制到屏幕或文件之间进行选择:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(4, 5))       # size in inches# use plot(), etc. to create your plot.
# Pick one of the following lines to uncomment# save_file = None# save_file = os.path.join(your_directory, your_file_name)
if save_file:plt.savefig(save_file)plt.close(fig)else:plt.show()

你也可以这样做:

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')

根据问题Matplotlib(pyplo)Savefig输出空白图像

有一点需要注意:如果您使用plt.show并且它应该在plt.savefig之后,否则您将给出一个空白图像。

一个详细的例子:

import numpy as npimport matplotlib.pyplot as plt

def draw_result(lst_iter, lst_loss, lst_acc, title):plt.plot(lst_iter, lst_loss, '-b', label='loss')plt.plot(lst_iter, lst_acc, '-r', label='accuracy')
plt.xlabel("n iteration")plt.legend(loc='upper left')plt.title(title)plt.savefig(title+".png")  # should before plt.show method
plt.show()

def test_draw():lst_iter = range(100)lst_loss = [0.01 * i + 0.01 * i ** 2 for i in xrange(100)]# lst_loss = np.random.randn(1, 100).reshape((100, ))lst_acc = [0.01 * i - 0.01 * i ** 2 for i in xrange(100)]# lst_acc = np.random.randn(1, 100).reshape((100, ))draw_result(lst_iter, lst_loss, lst_acc, "sgd_method")

if __name__ == '__main__':test_draw()

在此处输入图片描述

import matplotlib.pyplot as pltplt.savefig("image.png")

在Jupyter Notebook中,您必须删除plt.show()并添加plt.savefig(),以及一个单元格中的其余plt-code。图像仍然会显示在您的笔记本中。

鉴于今天(提出这个问题时还不可用)很多人使用Jupyter Notebook作为python控制台,有一种非常简单的方法可以将图保存为.png,只需从Jupyter Notebook调用matplotlibpylab类,绘制图形“内联”jupyter单元格,然后将该图形/图像拖到本地目录。别忘了%matplotlib inline在第一行!

您可以使用任何扩展名(png、jpg等)和所需的分辨率保存图像。这是一个保存图形的函数。

import os
def save_fig(fig_id, tight_layout=True, fig_extension="png", resolution=300):path = os.path.join(IMAGES_PATH, fig_id + "." + fig_extension)print("Saving figure", fig_id)if tight_layout:plt.tight_layout()plt.savefig(path, format=fig_extension, dpi=resolution)

'fig_id'是你想要保存你的身材的名字。希望它有帮助:)

除了上面的那些,我为名称添加了__file__,这样图片和Python文件就可以获得相同的名称。我还添加了一些参数以使它看起来更好:

# Saves a PNG file of the current graph to the folder and updates it every time# (nameOfimage, dpi=(sizeOfimage),Keeps_Labels_From_Disappearing)plt.savefig(__file__+".png",dpi=(250), bbox_inches='tight')# Hard coded name: './test.png'

你可以这样做:

def plotAFig():plt.figure()plt.plot(x,y,'b-')plt.savefig("figurename.png")plt.close()

如前所述,您可以使用:

import matplotlib.pyplot as pltplt.savefig("myfig.png")

用于保存您正在显示的任何IPhython图像。或者从不同的角度(从不同的角度看),如果您曾经使用过open cv,或者您导入了open cv,您可以选择:

import cv2
cv2.imwrite("myfig.png",image)

但这是以防万一,如果你需要使用Open CV。否则plt.savefig()应该足够了。

使用matplotlib.pyplot时,您必须先保存绘图,然后使用以下两行关闭它:

fig.savefig('plot.png') # save the plot, place the path you want to save the figure in quotationplt.close(fig) # close the figure window

没有什么对我有用。问题是保存的图像非常小,我找不到如何使它变大。

这似乎使它更大,但仍然不是全屏。

https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.set_size_inches

fig.set_size_inches(w, h)

希望这有助于某人。

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

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

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

嗯,我确实建议使用包装器来渲染或控制绘图。示例可以是mpltex(https://github.com/liuyxpp/mpltex)或,Prittyplotlib(https://github.com/olgabot/prettyplotlib)。

import mpltex
@mpltex.acs_decoratordef myplot():plt.figure()plt.plot(x,y,'b-',lable='xxx')plt.tight_layout(pad=0.5)plt.savefig('xxxx')  # the figure format was controlled by the decorator, it can be either eps, or pdf or png....plt.close()

我基本上经常使用这个装饰器在美国化学学会,美国物理学会,美国光学学会,Elsivier等各种期刊上发表学术论文。

可以在下面的图像中找到一个示例(https://github.com/MarkMa1990/gradientDescent):一个梯度下降的例子

使用'agg',因为服务器上没有GUI。使用gui和VSC在ubuntu 21.10上调试。在调试中,尝试显示绘图,然后保存为Web UI文件。

发现显示前需要保存,否则保存的绘图为空。我想显示会出于某种原因清除绘图。这样做:

plt.savefig(imagePath)plt.show()plt.close(fig)

而不是这个:

plt.show()plt.savefig(imagePath)plt.close(fig)