将绘图保存为图像文件而不是显示它

2024-12-05 08:37:00
admin
原创
211
摘要:问题描述:在 GUI 中显示图形:import matplotlib.pyplot as plt plt.plot([1, 2, 3], [1, 4, 9]) plt.show() 但是我该如何将图形保存到文件中(例如 foo.png)?解决方案 1:使用时matplotlib.pyplot.savefig,...

问题描述:

在 GUI 中显示图形:

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

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


解决方案 1:

使用时matplotlib.pyplot.savefig,可以通过扩展名指定文件格式:

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();否则,文件图像将为空白。

解决方案 2:

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

然而我发现在某些情况下图形总是会显示出来。(例如,当 Spyder 具有plt.ion():交互模式 = 开时。)我通过强制关闭图形窗口来解决这个问题:

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()(我没有自己测试)。

解决方案 3:

解决方案是:

import matplotlib.pyplot as plt

... # your way of creating the graph
plt.savefig('foo.png')

解决方案 4:

MatPlotLib 文档中有一节专门讨论此问题,但后来发生了变化。

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

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

新文档在此处:https://matplotlib.org/stable/users/faq/howto_faq.html#generate-images-without-having-a-window-appear
表示不调用plt.show()。但是,Spyder 的默认设置仍会导致图形显示。请参阅此提示以了解解决方法:
https: //stackoverflow.com/a/29931148/2453202

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

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

相反,使用plt.switch_backend('Agg')或关闭Spyder 首选项中的“启用支持matplotlib.use('Agg')”并自行运行命令。

从这两个提示:一、二

解决方案 5:

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

import matplotlib.image as mpimg

img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)

解决方案 6:

我使用了以下内容:

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 非常重要,否则它将不起作用。图形以 png 格式导出

解决方案 7:

import datetime
import numpy as np
from matplotlib.backends.backend_pdf import PdfPages
import 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 page
    plt.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.savefig
    plt.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. Seppxe4nen'
    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()

解决方案 8:

其他答案都是正确的。但是,我有时发现我想稍后打开图形对象。例如,我可能想更改标签大小、添加网格或进行其他处理。在理想情况下,我只需重新运行生成图的代码并调整设置即可。唉,世界并不完美。因此,除了保存为 PDF 或 PNG 之外,我还添加了:

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

这样,我稍后就可以加载图形对象并根据需要操作设置。

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

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

解决方案 9:

在使用 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()

解决方案 10:

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

plt.ioff()

(该命令随科学启动自动启动)

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

plt.ion()

解决方案 11:

您可以执行以下操作:

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

解决方案 12:

根据问题,Matplotlib(pyplot)savefig 输出空白图像。

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

详细示例:

import numpy as np
import 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()

在此处输入图片描述

解决方案 13:

解决方案:

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


import matplotlib

解决方案 14:

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

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

解决方案 15:

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

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

解决方案 16:

除了上述内容之外,我还添加了__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'

解决方案 17:

这只是额外的说明,因为我还不能对帖子发表评论。

如果您使用plt.savefig('myfig')或类似的东西,请确保plt.clf()在保存图像后添加。这是因为 savefig 不会关闭绘图,如果您在之后添加绘图而没有添加,那么plt.clf()您将添加到上一个绘图中。

您可能不会注意到您的情节是否相似,因为它将在前一个情节上进行绘制,但是如果您循环保存您的数据,情节将慢慢变得庞大并使您的脚本非常慢。

解决方案 18:

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

解决方案 19:

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

import mpltex

@mpltex.acs_decorator
def 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()

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

示例如下图所示(https://github.com/MarkMa1990/gradientDescent):
梯度下降的一个例子

解决方案 20:

正如之前建议的,您可以使用:

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

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

import cv2

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

但这只是为了以防万一你需要使用 Open CV。否则plt.savefig()就足够了。

解决方案 21:

只想指出,如果您明确定义了一个图形对象,那么从技术上讲,您可以按顺序执行plotshowsavefig。如果您使用的第三方库在后端使用 matplotlib,它会自动调用show(),从而导致savefig()保存空白图像,那么这尤其有用。因此,不要使用 plot/show + savefig,而要使用 figure + plot/show + savefig。

举个例子:

fig = plt.figure()                       # <--- define a figure object
plt.plot([1, 2, 3, 1])
plt.show()
fig.savefig('myimage.png', dpi=fig.dpi)  # <--- save the previously defined fig

一些库绘图仪返回一个图形;在这种情况下,保存该图形:

from statsmodels.tsa.seasonal import seasonal_decompose
fig = season_decompose(data).plot()
fig.savefig('myimage.png')

需要注意的一点plt.close()是,它不会从内存中删除图形实例,它只是关闭显示它的窗口;要完全刷新它,请使用plt.clf()/ fig.clf()

解决方案 22:

plt.savefig("name.png")绝对是保存可视化效果的最直接方法。

如果你正在寻找一个更全面的解决方案来组织可视化输出,请查看teeplot。这个库包装了绘图调用以自动管理 matplotlib 文件输出,并根据语义绘图变量选择有意义的文件名。

例子

此示例显示了对seaborn的调用,以保存如下图lmplot所示teeplot.tee`teeplots/col=time+hue=sex+viz=lmplot+x=total-bill+y=tip+ext={.pdf,.png}`

示例图

不加 -ing 即可保存show

>>> # adapted from seaborn.pydata.org/generated/seaborn.FacetGrid.html
>>> import seaborn as sns
>>> from teeplot import teeplot as tp
>>> tp.tee(sns.lmplot,  # plotter, then forwarded args/kwargs
>>>     sns.load_dataset("tips"), col="time", hue="sex", x="total_bill", y="tip"
>>>     teeplot_show=False, teeplot_verbose=True)
teeplots/col=time+hue=sex+viz=lmplot+x=total-bill+y=tip+ext=.pdf
teeplots/col=time+hue=sex+viz=lmplot+x=total-bill+y=tip+ext=.png

这样做的目的是使保存和分类地块的过程更加高效、系统化和有意义,从而免去手动文件管理的麻烦。

更多信息

teeplot可以安装为python3 -m pip install teeplot

teeplot还有其他高级功能,包括一个用于全局配置可视化输出文件类型(即“.pdf”、“.png”)等的界面。您可以在项目的使用指南API 列表中了解更多信息。

免责声明:我是图书馆作者

解决方案 23:

对我来说什么都不起作用。问题是保存的图像太小了,我不知道该如何把它放大。

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

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

fig.set_size_inches((w, h))

解决方案 24:

您可以使用任意扩展名(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' 是您想要保存图形的名称。希望对您有所帮助:)

解决方案 25:

由于服务器上没有 gui,因此使用“agg”。使用 gui 和 VSC 在 ubuntu 21.10 上进行调试。在调试中,尝试显示图表,然后保存到 Web UI 文件中。

发现显示前必须保存,否则保存的图是空白的。我猜显示会因为某种原因清除图。请执行以下操作:

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

而不是这样:

plt.show()
plt.savefig(imagePath) 
plt.close(fig)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用