在matplotlib中将X轴标签向下移动,但不影响X轴刻度

150 投票
3 回答
199636 浏览
提问于 2025-04-16 19:52

我正在使用Matplotlib来绘制直方图。根据我之前提问时得到的建议:Matplotlib - 给每个柱子加标签,我大致上解决了问题。

不过还有一个最后的问题——之前,x轴的标签(“时间(毫秒)”)显示在了x轴的刻度标记(0.00, 0.04, 0.08, 0.12等)下面。

没有间距 - 轴标签在图形下面

根据Joe Kingston的建议(见上面的提问),我尝试使用了:

ax.tick_params(axis='x', pad=30)

但是,这样做导致x轴的刻度标记(0.00, 0.04, 0.08, 0.12等)和x轴的标签(“时间(毫秒)”)都移动了:

30的间距 - 轴标签和刻度标记都移动了

有没有办法只把x轴的标签移动到三行图形的下面呢?

注意:你可能需要直接打开下面的PNG图片 - 右键点击图片,然后选择查看图片(在Firefox中),或者在新标签页中打开图片(在Chrome中)。StackOverflow对图片的缩放处理让它们几乎无法阅读。

3 个回答

1

与其手动调整边距,不如试试设置垂直对齐方式(va=):

ax.set_xlabel("x label", va='top');

如果你像@HYRY的回答那样手动修改标签的边距,有时候在保存图形时,标签可能会被裁剪掉。为了确保标签完整显示,在调用savefig()时设置bbox_inches='tight'。比如:

plt.plot(range(10))
plt.xlabel("x label", labelpad=30);
plt.savefig('img.png', bbox_inches='tight');

使用面向对象的API时,做法是这样的:

fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_xlabel("x label", labelpad=30);
fig.savefig('img.png', bbox_inches='tight');
14

如果变量 ax.xaxis._autolabelpos 的值是 True,matplotlib 会在 axis.py 文件中的 _update_label_position 函数里根据一些内容来设置标签的位置:

    bboxes, bboxes2 = self._get_tick_bboxes(ticks_to_draw, renderer)
    bbox = mtransforms.Bbox.union(bboxes)
    bottom = bbox.y0
    x, y = self.label.get_position()
    self.label.set_position((x, bottom - self.labelpad * self.figure.dpi / 72.0))

你可以通过以下方式独立设置标签的位置,而不受刻度的影响:

    ax.xaxis.set_label_coords(x0, y0)

这会把 _autolabelpos 设置为 False,或者像上面提到的那样,通过改变 labelpad 参数来实现。

269

使用labelpad参数:

pl.xlabel("...", labelpad=20)

或者在之后设置:

ax.xaxis.labelpad = 20

撰写回答