在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)
生成的图像大小是2040x1890像素,或者说是3.4"x3.15",但是x轴的标签被截断了。在图像编辑器中查看这个PNG文件时,发现坐标轴和刻度标签的大小是符合预期的。我尝试过计算输出大小和请求大小之间的差异,然后把这个差值反馈回去(3.25 - (3.4-3.25) = 3.10),但是matplotlib似乎会加上一个额外的缓冲区,结果还是没有达到想要的大小。那怎么才能制作出一个符合预期大小的整体图像呢?
2 个回答
matplotlib 1.1.1 版本新增了一个功能 figure.tight_layout()
(文档),这个功能可以帮你自动调整图形的布局。
根据David Robinson的评论,这里生成的图像大小是3.25乘3英寸,这是用Photoshop测量的,尽管x轴标签确实显示被截断了(使用的是Python 2.6 64位,mpl 1.1.0,操作系统是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)
这些边距的默认值是在matplotlibrc文件中设置的,你可以在那儿永久修改它。在我的情况下,底部边距的默认值是0.10。
无论你的图像大小是否正确,就像我遇到的情况一样,你都可以使用subplot_adjust来为标签提供足够的空间。如果需要的话,你还可以计算出修正值,以获得你想要的实际图像或图形大小,就像你之前做的那样。
保存的图像的最终效果取决于图像的大小。如果你用show()
显示图像,然后从matplotlib的视图框中保存它,你会发现标签在图像中被截断了。但是如果你手动增大图像的大小,你会看到标签出现了,保存时也会出现在保存的图像中。可以说这就是所见即所得(WYSIWYG)。如果你的图像非常小,标签就会被截断。因此,另一种方法是制作一个更大的图像,可能降低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) # <---
无论如何,我认为这算是matplotlib的一个bug,因为你应该能够在绘图和保存后得到一个完整的图像。