如何防止Matplotlib裁剪我的坐标轴标签?

8 投票
3 回答
10648 浏览
提问于 2025-04-18 01:00

我正在为一篇科学论文准备一些图表,这些图表需要宽而短,以便符合页面限制。不过,当我把它们保存为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文件看起来是这样的:

enter image description here

我该如何改变pdf文件的边界框呢?理想情况下,我希望有一个“正确”的解决方案,也就是自动调整大小,让所有内容都能整齐地放下,包括去掉左右两边多余的空白。不过我现在有点着急,所以只要能找到任何方法来改变边界框就行,如果需要的话,我会猜测一些数字直到看起来合适为止。

3 个回答

4

如果你正在为科学论文准备图表,我建议你自己来进行“裁剪”,可以使用

plt.subplots_adjust(left,right,bottom,top,..)

在创建图形后、保存之前进行操作。如果你是在ipython控制台运行的,也可以在生成图形后调用subplots_adjust,通过反复试验来调整边距。有些后端(我想至少Qt后端)还提供了一个图形界面来实现这个功能。

手动操作虽然需要时间,但大多数情况下能得到更精确的结果,尤其是我在使用Latex排版时的经验。

每当你需要将两个图形垂直或水平堆叠(比如使用subfigure这样的包)时,这都是唯一的选择,因为tight_layout无法保证两个图形的边距一致,导致坐标轴在论文中对不齐。

这是一个很好的链接,介绍了如何使用matplotlib进行出版,举例说明了如何设置图形宽度以匹配期刊的列宽。

14

经过一番搜索,我找到了解决办法:你可以在 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')

enter image description here

这些边框的尺寸真是刚刚好。

需要注意的是,这和Ffisegydd的回答稍有不同,因为它是调整边框来适应图形,而不是改变图形来适应边框。(不过这两种方法对我来说都没问题。)

7

你可以使用 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 的效果是一样的)。

示例图表

撰写回答