将旋转的 xticklabels 与其各自的 xtick 对齐

2025-01-13 08:53:00
admin
原创
121
摘要:问题描述:检查下图的 x 轴。如何将标签稍微向左移动,以便它们与各自的刻度对齐?我使用以下方法旋转标签:ax.set_xticks(xlabels_positions) ax.set_xticklabels(xlabels, rotation=45) 但如您所见,旋转以文本标签的中间为中心。这使得它们看起来像...

问题描述:

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

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

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

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

我尝试过用这个来代替:

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

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

例子


解决方案 1:

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

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

在此处输入图片描述

解决方案 2:

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

  • 对于rotation=45同时 ha='right'使用和rotation_mode='anchor'

  • 对于其他角度,请ScaledTranslation()使用


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)

缩放翻译

解决方案 3:

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

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)

在此处输入图片描述

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

解决方案 4:

一种简单、无循环的替代方法是使用horizontalalignmentText 属性作为 [1] 的关键字参数xticks。在下面的注释行中,我强制将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 文档中找到相关描述。

解决方案 5:

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

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

解决方案 6:

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

  • ha='right'

  • va='top'

  • rotation_mode='anchor'

这样,就无需使用ScaledTranslation。这似乎适用于所有旋转角度。

ax.set_xticklabels(labels, rotation=30, ha='right', va='top', rotation_mode='anchor')
``
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用