将旋转的xticklabel与其各自的xticks对齐


140

检查下图的x轴。如何将标签稍微向左移动,使其与各自的刻度线对齐?

我使用以下方法旋转标签:

ax.set_xticks(xlabels_positions)
ax.set_xticklabels(xlabels, rotation=45)

但是,如您所见,旋转位于文本标签的中间。这使得它们看起来像向右移动。

我试着用这个代替:

ax.set_xticklabels(xlabels, rotation=45, rotation_mode="anchor")

...但是它并没有达到我的期望。并且"anchor"似乎是该rotation_mode参数允许的唯一值。

例

Answers:


201

您可以设置刻度标签的水平对齐方式,请参见下面的示例。如果您想象旋转标签周围有一个矩形框,那么您要与刻度线对齐的是矩形的哪一侧?

根据您的描述,您需要:ha ='right'

n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Ticklabel %i' % i for i in range(n)]

fig, axs = plt.subplots(1,3, figsize=(12,3))

ha = ['right', 'center', 'left']

for n, ax in enumerate(axs):
    ax.plot(x,y, 'o-')
    ax.set_title(ha[n])
    ax.set_xticks(x)
    ax.set_xticklabels(xlabels, rotation=40, ha=ha[n])

在此处输入图片说明


15
xlabels = ax.get_xticklabels()如果只想使用现有标签,也可以使用。

谢谢罗格(Rutger),这是一个很好的例子,救了我一天!
alisa

13

旋转标签当然是可能的。请注意,这样做会降低文本的可读性。一种替代方法是使用如下代码替换标签位置:

import numpy as np
n=5

x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]


fig, ax = plt.subplots()
ax.plot(x,y, 'o-')
ax.set_xticks(x)
labels = ax.set_xticklabels(xlabels)
for i, label in enumerate(labels):
    label.set_y(label.get_position()[1] - (i % 2) * 0.075)

在此处输入图片说明

有关更多背景和替代方法,请参阅我的博客上的这篇文章


9

一种简单,无循环的替代方法是将horizontalalignmentText属性用作xticks[1] 的关键字参数。在下面的注释行中,我强制xticks对齐方式为“正确”。

n=5
x = np.arange(n)
y = np.sin(np.linspace(-3,3,n))
xlabels = ['Long ticklabel %i' % i for i in range(n)]
fig, ax = plt.subplots()
ax.plot(x,y, 'o-')

plt.xticks(
        [0,1,2,3,4],
        ["this label extends way past the figure's left boundary",
        "bad motorfinger", "green", "in the age of octopus diplomacy", "x"], 
        rotation=45,
        horizontalalignment="right")    # here
plt.show()

yticks默认情况下,其右边缘已与刻度线对齐,但xticks默认情况下显示为“中心”。)

[1] 如果您搜索短语“文本属性” ,则会xticks文档中找到描述的内容


3

如果您不想修改xtick标签,则可以使用:

plt.xticks(rotation=45)


3
但是,它也存在标签对齐错误的问题。但是,使用@RutgierCassies的把戏,一个的确可以使用plt.xticks(rotation=45,ha='right')
弗雷德里克Grosshans
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.