关于python:如何使pylab.savefig()将图像保存为“最大化”窗口而不是默认大小

您所在的位置:网站首页 python存图像像素 关于python:如何使pylab.savefig()将图像保存为“最大化”窗口而不是默认大小

关于python:如何使pylab.savefig()将图像保存为“最大化”窗口而不是默认大小

2024-07-10 06:00| 来源: 网络整理| 查看: 265

我在matplotlib中使用pylab创建绘图并将绘图保存到图像文件中。 但是,当我使用pylab.savefig( image_name )保存图像时,发现保存的SIZE图像与使用pylab.show()时显示的图像相同。

碰巧的是,我在图中有很多数据,当我使用pylab.show()时,必须最大化窗口,才能正确看到所有图,并且xlabel标记不会彼此叠加。

无论如何,在将图像保存到文件之前,可以通过编程方式"最大化"窗口吗? -目前,我仅获得"默认"窗口尺寸图像,这导致x轴标签彼此叠加。

matplotlib(pylab)中有两个主要选项可控制图像大小:

您可以以英寸为单位设置结果图像的大小 您可以为输出文件定义DPI(每英寸点数)(基本上是分辨率)

通常,您都希望两者都做,因为这样您就可以完全控制以像素为单位的结果图像大小。例如,如果要精确渲染800x600图像,则可以使用DPI = 100,并将尺寸设置为8 x 6英寸:

1234567import matplotlib.pyplot as plt # plot whatever you need... # now, before saving to file: figure = plt.gcf() # get current figure figure.set_size_inches(8, 6) # when saving, specify the DPI plt.savefig("myplot.png", dpi = 100)

一个人可以使用任何DPI。实际上,您可能想使用各种DPI和大小值以获得最喜欢的结果。但是请注意,使用很小的DPI并不是一个好主意,因为matplotlib可能找不到用于显示图例和其他文本的好的字体。例如,您不能设置DPI = 1,因为没有字体带有1个像素渲染的字符:)

从其他评论中,我了解到您遇到的其他问题是正确的文本呈现。为此,您还可以更改字体大小。例如,您可能每个字符使用6个像素,而不是默认使用的每个字符12个像素(有效地,使所有文本变小两倍)。

123import matplotlib #... matplotlib.rc('font', size=6)

最后,请参考原始文档: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefig,http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.gcf,http://matplotlib。 sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_inches,http://matplotlib.sourceforge.net/users/customizing.html#dynamic-rc-settings

附言抱歉,我没有使用pylab,但据我所知,以上所有代码在pylab中的工作方式相同-只需将代码中的plt替换为pylab(或在导入时分配的任何名称) pylab)。与matplotlib相同-改为使用pylab。

相关讨论 只是试图使用这个。某些东西仍然会减少我的像素。我有一个堆叠的numpy图像阵列,尺寸为800 x 4000像素,我想保存它而没有任何损失,因此我保存的图像恰好是800x4000像素。使用了数字(figsize =(8,40))和savefig(fname,dpi = 100)并收到576x2880像素PDF? 我刚刚确认这是PDF引擎的问题。 png正确显示出来。

您在初始化时设置大小:

1fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # in inches!

编辑:

如果问题出在x轴刻度上-您可以"手动"设置它们:

1fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) # You can actually compute the interval You need - and substitute here

以此类推,以及您情节的其他方面。您可以全部配置。这是一个例子:

123456789101112131415161718192021222324252627282930313233343536from numpy import arange import matplotlib # import matplotlib as mpl import matplotlib.pyplot # import matplotlib.pyplot as plt x1 = [1,2,3] y1 = [4,5,6] x2 = [1,2,3] y2 = [5,5,5] # initialization fig2 = matplotlib.pyplot.figure(figsize=(8.0, 5.0)) # The size of the figure is specified as (width, height) in inches # lines: l1 = fig2.add_subplot(111).plot(x1,y1, label=r"Text $formula$","r-", lw=2) l2 = fig2.add_subplot(111).plot(x2,y2, label=r"$legend2$" ,"g--", lw=3) fig2.add_subplot(111).legend((l1,l2), loc=0) # axes: fig2.add_subplot(111).grid(True) fig2.add_subplot(111).set_xticks(arange(1,3,0.5)) fig2.add_subplot(111).axis(xmin=3, xmax=6) # there're also ymin, ymax fig2.add_subplot(111).axis([0,4,3,6]) # all! fig2.add_subplot(111).set_xlim([0,4]) fig2.add_subplot(111).set_ylim([3,6]) # labels: fig2.add_subplot(111).set_xlabel(r"x $2^2$", fontsize=15, color ="r") fig2.add_subplot(111).set_ylabel(r"y $2^2$") fig2.add_subplot(111).set_title(r"title $6^4$") fig2.add_subplot(111).text(2, 5.5, r"an equation: $E=mc^2$", fontsize=15, color ="y") fig2.add_subplot(111).text(3, 2, unicode('f\\374r', 'latin-1')) # saving: fig2.savefig("fig2.png")

所以-您到底要配置什么?

相关讨论 感谢您的及时答复。但是,这不能解决问题。保存到文件中的图像是一个调用pylab.show()时显示的图像。对于要绘制的数据,我需要(手动)最大化窗口,以便在标签之间提供足够的间距。似乎在后台,pylab.savefig()正在执行pylab.show(),然后对DEFAULT大小窗口进行屏幕截图并将其保存到文件中。我需要保存窗口最大化时显示的图像 为什么不以非GUI方式自定义所有内容?我从未听说过可以在pylab.show()中使python意识到Youve。 我不确定我是否理解您的最后评论。我的意思是(如果您误解了我的评论),是您所建议的解决方案仍然会导致将图像保存到磁盘上,而该图像的所有X轴标签仍然皱缩在一起且不合格。我只是指出,保存到文件中的图像与调用pylab.show()时创建的图像完全相同。只有最大化GUI窗口时,我才能正确读取所有X轴标签。在我的脚本中,我正在生成数百个图像,因此手动最大化每个窗口并保存对于我来说是不切实际的。 续...我只是想找到一种在图像保存到文件之前以编程方式最大化窗口/画布(或至少指定特定大小)的方法。 +1,这是执行此操作的方法(设置figsize)。提问后5分钟给出了答案。无需赏金。 答案实际上并未回答问题。它可能解决了发问者的问题,但问题显然是如何保存最大化的数字-但这答案尚不清楚。 @HomunculusReticulli您设法找到了解决方法吗?我有相同的问题,建议的所有解决方案根本无法解决保存问题。 @SacreD我几年前问过这个问题;从我的评论来看,我认为我没有得到我想要的答案。抱歉,我无法提供更多帮助

我认为将图形保存到文件时需要指定其他分辨率:

123fig = matplotlib.pyplot.figure() # generate your plot fig.savefig("myfig.png",dpi=600)

指定较大的dpi值应具有与最大化GUI窗口相似的效果。

检查一下: 如何使用Python最大化plt.show()窗口

该命令因使用的后端而异。我发现这是确保保存的图片与我在屏幕上查看的图片具有相同缩放比例的最佳方法。

由于我将Canopy与QT后端一起使用:

1pylab.get_current_fig_manager().window.showMaximized()

然后,根据需要,通过silvado的答案增加DPI来调用savefig()。

相关讨论 出现以下错误AttributeError: _tkinter.tkapp object has no attribute showMaximized @NagabhushanSN听起来您可能正在使用其他后端。最大化的方法将有所不同。 哦!好的。谢谢!

我有这个确切的问题,这工作:

1plt.savefig(output_dir + '/xyz.png', bbox_inches='tight')

这里是文档:

[https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html][1]

您可以在一个保存的图中查看它的大小,例如1920x983 px(我保存最大化窗口时的大小),然后将dpi设置为100,将大小设置为19.20x9.83,它可以正常工作。保存的金额等于最大化的数字。

123456import numpy as np import matplotlib.pyplot as plt x, y = np.genfromtxt('fname.dat', usecols=(0,1), unpack=True) a = plt.figure(figsize=(19.20,9.83)) a = plt.plot(x, y, '-') plt.savefig('file.png',format='png',dpi=100)

我之前也进行过相同的搜索,看来他的确切解决方案取决于后端。

我已经阅读了很多资源,也许最有用的是Pythonio的答案,这里如何使用Python最大化plt.show()窗口 我调整了代码,并最终获得了以下功能。 它在Windows上对我来说效果不错,我主要使用Qt,在这里我经常使用它,而对其他后端的测试却很少。

基本上,它包括标识后端并调用适当的函数。请注意,之后我添加了一个暂停,因为我遇到了一些窗口最大化而其他窗口没有最大化的问题,看来这对我来说已经解决了。

123456789101112131415161718192021def maximize(backend=None,fullscreen=False):    """Maximize window independently on backend.     Fullscreen sets fullscreen mode, that is same as maximized, but it doesn't have title bar (press key F to toggle full screen mode)."""     if backend is None:         backend=matplotlib.get_backend()     mng = plt.get_current_fig_manager()     if fullscreen:         mng.full_screen_toggle()     else:         if backend == 'wxAgg':             mng.frame.Maximize(True)         elif backend == 'Qt4Agg' or backend == 'Qt5Agg':             mng.window.showMaximized()         elif backend == 'TkAgg':             mng.window.state('zoomed') #works fine on Windows!         else:             print ("Unrecognized backend:",backend) #not tested on different backends (only Qt)     plt.show()     plt.pause(0.1) #this is needed to make sure following processing gets applied (e.g. tight_layout) 相关讨论 对于ubuntu上的TkAgg,您可以尝试: mng = plt.get_current_fig_manager() mng.resize(*mng.window.maxsize()) 来自stackoverflow.com/questions/12439588/

如果我正确理解您要做什么,则可以创建图形并设置窗口的大小。之后,您可以使用matplotlib工具箱按钮保存图形。这里是一个例子:

123456789from pylab import get_current_fig_manager,show,plt,imshow plt.Figure() thismanager = get_current_fig_manager() thismanager.window.wm_geometry("500x500+0+0") #in this case 500 is the size (in pixel) of the figure window. In your case you want to maximise to the size of your screen or whatever imshow(your_data) show()

相关讨论 "您可以使用matplotlib工具箱按钮保存图形"-正是我要避免的。我想要一种自动化的(即可编程的)解决方案,而不是手动的解决方案,因为我将在一个脚本中生成数百个图像。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3