我正在编写一个快速而肮脏的脚本来动态生成绘图。我使用下面的代码(来自Matplotlib文档)作为起点:
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),因此,例如,它可以在批处理脚本中使用。我该怎么做?
答案 0 :(得分:1150)
虽然问题已经得到解答,但我想在使用matplotlib.pyplot.savefig时添加一些有用的提示。文件格式可以通过扩展名指定:
from matplotlib import pyplot as plt
plt.savefig('foo.png')
plt.savefig('foo.pdf')
分别给出栅格化或矢量化输出,两者都有用。此外,你会发现pylab
在图像周围留下了一个慷慨的,通常是不受欢迎的空白空间。将其删除:
savefig('foo.png', bbox_inches='tight')
答案 1 :(得分:159)
正如其他人所说,$str = addBlank("superman");
//the value of $str is now sup_rman
$str = addBlank($str)
//the value of $str is now sup_r_an
或plt.savefig()
确实是保存图片的方式。
但是我发现在某些情况下(例如Spyder有fig1.savefig()
:交互模式= On),总会显示数字。我通过在我的巨型循环中强制关闭图形窗口来解决这个问题,所以我在循环期间没有一百万个开放数字:
plt.ion()
答案 2 :(得分:155)
解决方案是:
pylab.savefig('foo.png')
答案 3 :(得分:79)
刚刚在MatPlotLib文档中找到了这个链接,正好解决了这个问题: http://matplotlib.org/faq/howto_faq.html#generate-images-without-having-a-window-appear
他们说防止数字弹出的最简单方法是通过matplotib.use(<backend>)
使用非交互式后端(例如Agg),例如:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
plt.plot([1,2,3])
plt.savefig('myfig')
我个人更喜欢使用plt.close( fig )
,因为您可以选择隐藏某些数字(在循环期间),但仍然显示循环后数据处理的数字。它可能比选择非交互式后端要慢 - 如果有人测试过它会很有趣。
UPDATE :对于Spyder,您通常无法以这种方式设置后端(因为Spyder通常会提前加载matplotlib,阻止您使用matplotlib.use()
)。
相反,在Spyder首选项中使用plt.switch_backend('Agg')
或关闭“启用支持”并自行运行matplotlib.use('Agg')
命令。
答案 4 :(得分:43)
如果你不喜欢&#34;当前&#34;的概念?图,做:
import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img)
答案 5 :(得分:26)
其他答案都是正确的。但是,我有时会发现我想稍后打开图形 object 。例如,我可能想要更改标签大小,添加网格或进行其他处理。在一个完美的世界中,我只需重新运行生成绘图的代码,并调整设置。唉,世界并不完美。因此,除了保存为PDF或PNG之外,我还添加:
with open('some_file.pkl', "wb") as fp:
pickle.dump(fig, fp, protocol=4)
像这样,我可以稍后加载图形对象并操纵设置。
我还为堆栈中的每个函数/方法写出了包含源代码和locals()
字典的堆栈,以便稍后我可以准确地告诉生成该图的内容。
注意:请注意,因为有时这种方法会生成大量文件。
答案 6 :(得分:24)
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. 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()
答案 7 :(得分:24)
使用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()
答案 8 :(得分:21)
我使用了以下内容:
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 exported in png
答案 9 :(得分:12)
您可以这样做:
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')
答案 10 :(得分:11)
如果像我一样使用Spyder IDE,则必须使用以下命令禁用交互模式:
plt.ioff()
(此命令随科学启动自动启动)
如果您想再次启用它,请使用:
plt.ion()
答案 11 :(得分:11)
解决方案:
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
答案 12 :(得分:6)
根据问题Matplotlib (pyplot) savefig outputs blank image。
应该注意一件事:如果您使用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 :(得分:6)
使用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
答案 14 :(得分:5)
#write the code for the plot
plt.savefig("filename.png")
该文件将保存在与运行
的python / Jupyter文件相同的目录中答案 15 :(得分:5)
import matplotlib.pyplot as plt
plt.savefig("image.png")
在Jupyter Notebook中,您必须删除plt.show()
并添加plt.savefig()
以及一个单元格中的其余plt代码。
该图像仍将显示在笔记本中。
答案 16 :(得分:2)
鉴于今天(提出此问题时尚不可用)很多人都将Jupyter Notebook用作python控制台,所以有一种极其简单的方法将图另存为.png
,只需调用{{1} }的matplotlib
类(来自Jupyter Notebook),绘制图形“内联” jupyter单元,然后将图形/图像拖到本地目录。别忘了
第一行中的pylab
!
答案 17 :(得分:1)
如前所述,您可以使用:
import matplotlib.pyplot as plt
plt.savefig("myfig.png")
用于保存您正在显示的任何IPhython图像。或者换个角度看(从另一个角度看),如果您曾经使用过开放式简历,或者如果您导入过开放式简历,则可以:
导入cv2
cv2.imwrite(“ myfig.png”,图像)
但是,这是万一情况,如果您需要使用Open CV。否则,plt.savefig()应该足够。
答案 18 :(得分:1)
好吧,我确实建议使用包装器来渲染或控制绘图。示例可以是 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()
我基本上经常使用这个装饰器在美国化学学会、美国物理学会、美国光学学会、Elsivier 等的各种期刊上发表学术论文。
答案 19 :(得分:0)
您可以使用任何扩展名(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”是您要用来保存图形的名称。希望对您有所帮助:)
答案 20 :(得分:0)
除上述内容外,我还添加了__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'
找到了最后的提示HERE。
答案 21 :(得分:0)
没有什么对我有用。问题是保存的图像非常小,我找不到他妈的怎么让它变大。
这似乎使它变大了,但仍然不是全屏。
https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.set_size_inches
fig.set_size_inches((w, h))
希望对某人有所帮助。
答案 22 :(得分:0)
额外说明一下,因为我还不能对帖子发表评论。
如果您使用 plt.savefig('myfig')
或类似的东西,请确保在保存图像后添加 plt.clf()
。这是因为 savefig 不会关闭绘图,如果您在没有 plt.clf()
之后添加到绘图中,您将添加到前一个绘图中。
您可能不会注意到您的情节是否与之前的情节相似,但如果您在循环中保存您的人物,情节会慢慢变得庞大,并使您的脚本变得非常缓慢。
答案 23 :(得分:-1)
您可以这样做:
conda install module_name