在matplotlib中将X轴标签向下移动,但不影响X轴刻度
我正在使用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轴的标签(“时间(毫秒)”)都移动了:
有没有办法只把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