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

7

我正在为一篇科学论文准备一些图表,需要宽而短以适应页面限制。然而,当我将它们保存为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个回答

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')

输入图像描述

这些英寸太紧了,我想。

请注意,这与Ffisegydd的答案略有不同,因为它将边界框调整到绘图中,而不是将绘图调整到边界框。 (但对于我的目的,两者都可以。)


对于那些已经设置了样式表(我建议每个人都这样做,参见文档,它会改变你的生活),您可以将savefig.bbox参数设置为tight(而不是standard)。要使plt.show()plt.savefig()获得相同的结果,还需将figure.autolayout参数设置为True(默认值为False)。 - Vegard Gjeldvik Jervell

6
你可以使用plt.tight_layout()来调整matplotlib绘图的布局。 tight_layout()会自动调整尺寸,并且在标签/刻度等重叠时也可以使用。请参考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 文件(无法上传 pdf 到 Stack Overflow,但我已经检查过它并且 pdf 的工作方式与此相同)。

示例图


1
我接受这个答案,但任何未来的访问者可能也会对我的答案感兴趣,该答案将边界框调整为适合绘图,而不是相反。 - N. Virgo

4
如果你正在为一篇科技论文准备内容,我建议你自己进行“剪辑”,使用...
plt.subplots_adjust(left,right,bottom,top,..)

在创建图形后,在保存之前使用 subplots_adjust 来调整边距,如果你是从 ipython 控制台运行程序,也可以在生成图形后调用该函数,并通过试错方法来调整边距。某些后端(我认为至少 Qt 后端)还会提供此功能的 GUI。
手动调整需要时间,但在我的经验中,大多数情况下可以提供更精确的结果,特别是在 Latex 渲染时。
这是当你必须将两个图形垂直或水平堆叠在一起时的唯一选择(例如使用 subfigure 等软件包),因为 tight_layout 不能保证两个图形具有相同的边距,而且轴会在纸上对齐不准。
这是一个关于使用 matplotlib 进行出版物的不错的链接,涉及如何设置图形宽度以匹配期刊栏宽。

谢谢,那个链接非常有帮助。 - N. Virgo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接