183

检查下图的x轴。如何将标签向左移动一点,以便它们与各自的刻度对齐?

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

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

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

我试过用这个代替:

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

...但它并没有达到我想要的效果。并且"anchor"似乎是rotation_mode参数允许的唯一值。

例子

4

6 回答 6

254

您可以设置刻度标签的水平对齐方式,请参见下面的示例。如果您想象一个围绕旋转标签的矩形框,您希望矩形的哪一侧与刻度点对齐?

根据您的描述,您想要: 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])

在此处输入图像描述

于 2013-02-13T12:51:08.783 回答
24

ha='right'不足以在视觉上将标签与刻度对齐:

  • 对于rotation=45同时 ha='right'使用和rotation_mode='anchor'
  • ScaledTranslation()对于其他角度,请使用 a

rotation_mode='anchor'

如果旋转角度大约为 45°,请ha='right'结合rotation_mode='anchor'

ax.set_xticks(ticks)
ax.set_xticklabels(labels, rotation=45, ha='right', rotation_mode='anchor')

或者在 matplotlib 3.5.0+ 中,一次设置刻度和标签

ax.set_xticks(ticks, labels, rotation=45, ha='right', rotation_mode='anchor')

锚定旋转


ScaledTranslation()

如果旋转角度更极端(例如,70°),或者您只是想要更细粒度的控制,则锚定效果不佳。相反,应用线性变换

ax.set_xticks(ticks)
ax.set_xticklabels(labels, rotation=70)

# create -5pt offset in x direction
from matplotlib.transforms import ScaledTranslation
dx, dy = -5, 0
offset = ScaledTranslation(dx / fig.dpi, dy / fig.dpi, fig.dpi_scale_trans)

# apply offset to all xticklabels
for label in ax.xaxis.get_majorticklabels():
    label.set_transform(label.get_transform() + offset)

比例平移

于 2021-05-09T15:49:25.290 回答
21

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

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)

在此处输入图像描述

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

于 2017-11-26T19:48:14.790 回答
13

一个简单、无循环的替代方法是使用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 文档中描述的内容。

于 2018-04-05T23:13:04.637 回答
8

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

plt.xticks(rotation=45)

于 2018-09-18T00:05:56.553 回答
8

我显然迟到了,但有一个官方例子使用

plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

旋转标签,同时保持它们与刻度线正确对齐,既干净又容易。

见:https ://matplotlib.org/stable/gallery/images_contours_and_fields/image_annotated_heatmap.html

于 2021-07-02T13:15:40.110 回答