2012-04-06 249 views
38

我在matplotlib中使用pylab创建一个绘图并将绘图保存到图像文件。但是,当我使用pylab.savefig(image_name)保存图像时,我发现保存的SIZE图像与我使用pylab.show()时显示的图像相同。如何使pylab.savefig()保存为'最大化'窗口而不是默认大小的图像

碰巧,我在图中有很多数据,当我使用pylab.show()时,我必须先将窗口最大化,然后才能正确看到所有图,并且xlabel标记不会叠加在每个图上其他。

无论如何,我可以在将图像保存到文件之前以编程方式“最大化”窗口吗? - 此刻,我只获取'默认'窗口大小的图像,这会导致x轴标签相互叠加。

回答

19

您设置初始化大小:

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

编辑

如果问题是与x轴蜱 - 你可以在 “手动” 进行设置:

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

等等与您的情节的其他方面。你可以配置全部。这里有一个例子:

from 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") 

所以 - 你想要什么配置?

+2

感谢您的及时响应。但是,这并不能解决问题。保存到文件的图像是在调用'pylab.show()'时显示的图像。对于我正在绘制的数据,我需要(手动)最大化窗口,以便在标签之间提供足够的间距。几乎看起来,在这个场景后面,'pylab.savefig()'正在做一个'pylab.show()',然后对** DEFAULT **大小窗口进行屏幕截图并将其保存到文件中。我需要保存窗口显示为** MAXIMIZED **时显示的图像** – 2012-04-06 10:07:44

+0

为什么不定制它所有的非GUI方式?我从来没有听说过可以让Python知道你已经在pylab.show()中完成了。 – Adobe 2012-04-06 10:27:45

+0

我不确定我是否理解您的最新评论。我的意思是(如果你误解了我的评论),是你提出的解决方案,仍然会导致图像被保存到磁盘上,但仍然有所有X轴标签“皱在一起”并且不合格。我只是指出保存到文件的图像与调用“pylab.show()”时创建的图像完全相同。只有当我最大化GUI窗口时,才能正确读取所有X轴标签。在我的脚本中,我生成了数百个图像,因此手动最大化每个窗口并保存是不切实际的。 – 2012-04-06 10:46:53

1

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

from 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() 
+4

“你可以用matplotlib工具箱按钮保存你的图形” - 这是**完全**我试图避免的。我想要一个自动化(即可编程)的解决方案,而不是手动解决方案,因为我将在脚本中生成数百个图像。 – 2012-04-19 08:30:03

7

我认为你需要指定保存图形的文件时,不同的分辨率:

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

指定较大的dpi值应该有一个类似的效果最大化的GUI窗口。

36

有在matplotlib(pylab)两大选项来控制图片大小:

  1. 您可以设置生成的图像的尺寸以英寸为单位
  2. 您可以定义的DPI(每英寸点数)输出文件(基本上,它是一个分辨率)

通常情况下,你想两者都做,因为这样一来,你会在像素具有完全控制在生成的图像尺寸。例如,如果你想准确地表现为800x600的图像,你可以使用DPI = 100,并设置大小8×6英寸中:

import 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个像素(有效地使所有文本缩小两次)。

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

最后,原来的文件提供一些参考: http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.savefighttp://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.gcfhttp://matplotlib.sourceforge.net/api/figure_api.html#matplotlib.figure.Figure.set_size_incheshttp://matplotlib.sourceforge.net/users/customizing.html#dynamic-rc-settings

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

+0

只是试图使用这个。东西仍然会减少我的像素。我有一个800×4000像素的堆叠numpy图像阵列,我想保存它没有任何损失,所以我保存的图像为800x4000像素。使用的数字(figsize =(8,40))和savefig(fname,dpi = 100)并获得576x2880像素PDF? – 2012-10-02 02:50:28

+0

我刚刚确认这是一个PDF引擎的问题。一个PNG出来正确。 – 2012-10-02 03:02:32

3

检查: How to maximize a plt.show() window using Python

的命令,这取决于后端您使用的是不同的。我发现这是确保保存的图片具有与我在屏幕上观看的图片相同比例的最佳方式。

由于我使用雨棚与QT后端:

pylab.get_current_fig_manager().window.showMaximized() 

我然后调用savefig()按silvado的答案需要用增加的DPI。

相关问题