如何防止Matplotlib裁剪我的坐标轴标签?
我正在为一篇科学论文准备一些图表,这些图表需要宽而短,以便符合页面限制。不过,当我把它们保存为pdf格式时,x轴的标签消失了,因为(我想)它们超出了边界框。
在iPython笔记本中输入以下内容就能重现这个问题。
%pylab inline
pylab.rcParams['figure.figsize'] = (8.0, 2.0)
plot([1,5,2,4,6,2,1])
xlabel("$x$")
ylabel("$y$")
savefig("test.pdf")
生成的pdf文件看起来是这样的:

我该如何改变pdf文件的边界框呢?理想情况下,我希望有一个“正确”的解决方案,也就是自动调整大小,让所有内容都能整齐地放下,包括去掉左右两边多余的空白。不过我现在有点着急,所以只要能找到任何方法来改变边界框就行,如果需要的话,我会猜测一些数字直到看起来合适为止。
3 个回答
如果你正在为科学论文准备图表,我建议你自己来进行“裁剪”,可以使用
plt.subplots_adjust(left,right,bottom,top,..)
在创建图形后、保存之前进行操作。如果你是在ipython控制台运行的,也可以在生成图形后调用subplots_adjust
,通过反复试验来调整边距。有些后端(我想至少Qt后端)还提供了一个图形界面来实现这个功能。
手动操作虽然需要时间,但大多数情况下能得到更精确的结果,尤其是我在使用Latex排版时的经验。
每当你需要将两个图形垂直或水平堆叠(比如使用subfigure
这样的包)时,这都是唯一的选择,因为tight_layout
无法保证两个图形的边距一致,导致坐标轴在论文中对不齐。
这是一个很好的链接,介绍了如何使用matplotlib进行出版,举例说明了如何设置图形宽度以匹配期刊的列宽。
经过一番搜索,我找到了解决办法:你可以在 savefig
命令中加上 bbox_inches='tight'
,这样它会自动调整边框的大小,让它刚好包住内容:
%pylab inline
pylab.rcParams['figure.figsize'] = (8.0, 2.0)
plot([1,5,2,4,6,2,1])
xlabel("$x$")
ylabel("$y$")
savefig("test.pdf",bbox_inches='tight')
这些边框的尺寸真是刚刚好。
需要注意的是,这和Ffisegydd的回答稍有不同,因为它是调整边框来适应图形,而不是改变图形来适应边框。(不过这两种方法对我来说都没问题。)
你可以使用 plt.tight_layout()
这个命令来让 matplotlib 自动调整你图表的布局。tight_layout()
会自动调整图表的大小和形状,特别是在你有重叠的标签、刻度等情况时,它会很有用。
%pylab inline
pylab.rcParams['figure.figsize'] = (8.0, 2.0)
plot([1,5,2,4,6,2,1])
xlabel("$x$")
ylabel("$y$")
tight_layout()
savefig("test.pdf")
这里有一个输出的 .png 图片(虽然不能在 StackOverflow 上传 pdf 文件,但我检查过,pdf 的效果是一样的)。