matplotlib中的精确图形大小,带有标题,轴标签

swi*_*144 18 python matplotlib

之前已经提出过类似的问题,但我的所有搜索结果都没有解决我的问题.请参考以下示例代码:

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0,1,5,2,9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png',dpi=600)
Run Code Online (Sandbox Code Playgroud)

得到的数字是2040x1890像素,或3.4"x3.15",并且x标签被切断.在图像编辑器中查看PNG文件,轴和刻度标签似乎符合所需的大小.我已经尝试从输出大小和请求的大小中取出差异并将其反馈到(3.25 - (3.4-3.25)= 3.10,但是matplotlib似乎添加了一个任意缓冲区并且它仍然没有达到所需的大小.如何制作出所需尺寸的整体数字?

joa*_*uin 10

与大卫罗宾逊的评论一致,这里产生的数字是由photoshop测量的3.25 x 3英寸,虽然xlabel确实显示截止(蟒蛇2.6中的mpl 1.1.0 64位,win7)

克服该问题的解决方案是手动调整边距subplot_adjust:

from matplotlib.pyplot import *
fig = figure(1, figsize=(3.25, 3))
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
subplots_adjust(bottom=0.14)   # <--
fig.savefig('test.png', dpi=600) 
Run Code Online (Sandbox Code Playgroud)

这些边距的默认值在matploblibrc文件中设置,您可以永久修改它.在我的情况下,底部边距的默认值是0.10.

如果您的数字大小错误或正确,如我的情况,您可以使用subplot_adjust为标签提供足够的空间.然后,如果需要,您可以计算校正以获得您想要的实际图片或图形尺寸.

保存的数字的最终视图取决于该数字的大小.如果你是show()你的数字,你从matplotlib视图框保存它,你会得到图像中的标签截止.但是,如果手动增加图像的大小,您将看到标签出现,如果保存,则它也会出现在保存的图像中.让我们说这是所见即所得.你的身材尺寸非常小,这会让你的标签被剪掉.因此,另一种方法是使用更低的dpi来制作更大的数字以保持整体尺寸.这也有效:

from matplotlib.pyplot import *
fig = figure(1, figsize=(6.5, 6))   # <---
plot([0, 1, 5, 2, 9])
title('title')
xlabel('xAxis')
ylabel('yAxis')
fig.savefig('test.png', dpi=300)    # <---
Run Code Online (Sandbox Code Playgroud)

在任何情况下,我都认为这是一个matplolib错误,因为你可以期望在绘图和保存后有一个未切割的数字.


tac*_*ell 8

matplotlib 1.1.1添加了figure.tight_layout()(doc)将为您执行此操作.