我在matplotlib中使用pylab来创建绘图并将绘图保存到图像文件中。但是,当我使用pylab.savefig( image_name )
保存图片时,我发现保存的 SIZE 图像与我使用pylab.show()
时显示的图像相同。
碰巧,我在剧情中有很多数据,当我使用pylab.show()
时,我必须最大化窗口才能正确看到所有的情节,并且xlabel代码不会相互叠加。
无论如何,我可以在将图像保存到文件之前以编程方式“最大化”窗口吗? - 目前,我只获得'默认'窗口大小的图像,这导致x轴标签相互叠加。
答案 0 :(得分:46)
matplotlib(pylab)有两个主要选项来控制图像大小:
通常情况下,您希望同时执行这两项操作,因为这样您将对生成的图像大小以像素为单位完全控制 。例如,如果要精确渲染800x600图像,可以使用DPI = 100,并将大小设置为8 x 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.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
P.S。对不起,我没有使用pylab,但据我所知,上面的所有代码在pylab中都会以相同的方式工作 - 只需用我的代码中的plt
替换pylab
(或任何名称)你在导入pylab时分配的)。 matplotlib
也是如此 - 请改用pylab
。
答案 1 :(得分:23)
您可以在初始化时设置大小:
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 :(得分:7)
我认为在将图形保存到文件时需要指定不同的分辨率:
fig = matplotlib.pyplot.figure()
# generate your plot
fig.savefig("myfig.png",dpi=600)
指定较大的dpi值应具有与最大化GUI窗口类似的效果。
答案 3 :(得分:3)
检查一下: How to maximize a plt.show() window using Python
根据您使用的后端,命令会有所不同。我发现这是确保保存的图片与我在屏幕上查看的图片具有相同比例的最佳方式。
因为我使用Canopy和QT后端:
pylab.get_current_fig_manager().window.showMaximized()
然后根据需要调用savefig(),每个silvado的答案增加DPI。
答案 4 :(得分:3)
我遇到了这个确切的问题,并且有效:
plt.savefig(output_dir + '/xyz.png', bbox_inches='tight')
以下是文档:
[https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.savefig.html][1]
答案 5 :(得分:1)
我之前也进行过相同的搜索,看来他的确切解决方案取决于后端。
我已经阅读了很多资料,可能最有用的是Pythonio在这里How to maximize a plt.show() window using Python的回答。 我调整了代码并结束了下面的功能。 它在Windows上对我来说效果很好,我主要使用Qt,在这里我经常使用它,而对其他后端的测试却很少。
基本上,它包括标识后端并调用适当的函数。请注意,之后我添加了一个暂停,因为我遇到了一些窗口最大化而其他窗口没有最大化的问题,看来这对我来说已经解决了。
bash
答案 6 :(得分:1)
您可以在一个保存的图中查看它的大小,例如1920x983 px(当我保存最大化窗口时的大小),然后将dpi设置为100,大小设置为19.20x9.83,它可以正常工作。保存的数字等于最大化的数字。
import 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)
答案 7 :(得分:-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()