matplotlib 将旋转的xticklabel与其各自的xtick对齐

qqrboqgw  于 2023-05-01  发布在  其他
关注(0)|答案(6)|浏览(254)

检查下图的x轴。如何将标签向左移动一点,使它们与各自的刻度对齐?
我使用以下命令旋转标签:

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

但是,如您所见,旋转的中心是文本标签的中间。这使得它们看起来像是向右移动了。
我试着用这个代替:

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

……但它没有实现我的愿望。"anchor"似乎是rotation_mode参数唯一允许的值。

t5zmwmid

t5zmwmid1#

您可以设置ticklabels的水平对齐方式,请参见下面的示例。如果您设想旋转标签周围有一个矩形框,您希望矩形的哪一边与刻度点对齐?
根据您的描述,您需要:哈='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])

btxsgosb

btxsgosb2#

ha='right'不足以可视化对齐标签和刻度:

  • 对于rotation=45,使用bothha='right'rotation_mode='anchor'
  • 对于其他Angular ,请使用ScaledTranslation()

rotation_mode='anchor'

如果旋转Angular 约为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+,set ticks and labels at once

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

ScaledTranslation()

如果旋转Angular 更极端(e.如果锚定不起作用,或者您只是想要更细粒度的控制,锚定不会很好地工作。相反,apply a linear transform

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)

093gszye

093gszye3#

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

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)

有关更多背景信息和备选方案,请参见this post on my blog

igetnqfo

igetnqfo4#

一个简单、无循环的替代方法是使用horizontalalignment Text属性作为xticks [1]的关键字参数。在下面的注解行中,我强制xticks对齐为“right”。

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 documentation中描述的内容。

3hvapo4f

3hvapo4f5#

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

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

t30tvxxf

t30tvxxf6#

@tdy的回答近乎完美。我认为让标签看起来漂亮的一个更快的方法是使用以下所有三个设置的组合:

  • ha='right'
  • va='top'
  • rotation_mode='anchor'

这样,就不需要使用ScaledTranslation。这似乎对所有旋转Angular 都很有效。

ax.set_xticklabels(labels, rotation=30, ha='right', va='top', rotation_mode='anchor')
``

相关问题