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

问题描述 投票:0回答:3

我正在为一篇科学论文准备一些图表,这些图表需要又宽又短,以适应页数限制。但是,当我将它们另存为 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 文件的边框?理想情况下,我想要一个“正确执行”的解决方案,即自动调整大小,以便一切都整齐地适合,包括摆脱左侧和右侧不必要的空间 - 但我很着急,所以我会接受任何改变边界框的方法,如果有必要的话,我会猜测数字,直到它看起来正确为止。

python matplotlib axes axis-labels
3个回答
14
投票

谷歌一番后,我找到了答案:你可以给

bbox_inches='tight'
命令赋予
savefig
,它会自动将边界框调整为内容的大小:

%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(无法将 pdf 上传到 SO,但我已经检查过,它的工作方式与 pdf 相同)。

Example plot


5
投票

如果您正在准备科学论文的情节,我建议您自己进行“剪辑”, 使用

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

创建图形之后和保存之前。如果您从 ipython 控制台运行,您还可以在生成图形后调用

subplots_adjust
,并通过反复试验调整边距。一些后端(我认为至少是 Qt 后端)也公开了此功能的 GUI。

手动执行此操作需要时间,但大多数时候可以提供更精确的结果,尤其是根据我的经验使用 Latex 渲染。

当您必须垂直或水平堆叠两个图形时(例如使用像

subfigure
这样的包),这是唯一的选择,因为
tight_layout
不能保证两个图形中的边距相同,并且轴将导致未对齐纸。

这是关于使用 matplotlib 进行出版物的一个很好的 link,例如涵盖如何设置图形宽度以匹配期刊列宽度。

© www.soinside.com 2019 - 2024. All rights reserved.