You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib中实现X轴下方多标签等距对齐

动态渲染Matplotlib X轴下方的不等长标签

问题描述

需要在Matplotlib图表的X轴下方添加5-6个文本长度不一的标签,当前手动计算文本宽度并调整位置的方式,在文本长度变化时需要反复修改参数,无法自适应避免重叠或间距过大,希望实现动态渲染,让标签无论文本长度如何都能保持均匀间距。

解决方案

可以利用Matplotlib的offsetbox模块中的HPacker工具,它能自动水平排列多个文本元素,并统一控制元素间的间距,无需手动计算每个文本的宽度。具体实现如下:

修改后的代码

import matplotlib.pyplot as plt
from matplotlib.offsetbox import TextArea, HPacker

# 画布尺寸设置
frame_width = 1920
frame_height = 1080 

fig, ax = plt.subplots(1, 1, figsize=(frame_width/100, frame_height/100))
ax.set_xlim(1, 20)

# 标签样式参数
txt_color = 'White'
text_font_size = 12
text_font = 'Arial'
box_colors = ['g', 'c', 'm', 'b', 'y']  # 对应每个标签的背景色

# 需要添加的标签文本列表
labels = [
    "ATTENTION",
    "CONVICTION",
    "INTEREST IN SPORTS",
    "LONGER EXAMPLE TEXT",
    "SHORT"
]

# 创建每个标签的TextArea对象
text_areas = []
for txt, color in zip(labels, box_colors):
    ta = TextArea(txt, 
                  textprops={'ha': 'left', 'va': 'center', 'weight': 'bold',
                             'color': txt_color, 'family': text_font, 'fontsize': text_font_size},
                  bbox={'facecolor': color, 'edgecolor': color})
    text_areas.append(ta)

# 用HPacker水平排列文本框,pad是元素间的间距,sep是额外分隔空间
packer = HPacker(children=text_areas,
                 align='center',
                 pad=5,  # 文本框之间的固定间距(像素)
                 sep=0)

# 将组合框添加到图表底部,位置用归一化坐标定位
ax.add_artist(packer)
packer.set_offset((0.15, 0.07), transform=fig.transFigure)

plt.show()

关键说明

  • HPacker会自动计算每个TextArea的宽度,按顺序排列后确保元素间间距统一;
  • pad参数控制文本框之间的固定间距,无需手动调整;
  • 标签文本、样式可直接通过列表修改,无需逐个计算位置,完全自适应文本长度变化;
  • 使用fig.transFigure归一化坐标定位,确保在不同尺寸画布上位置稳定。

内容的提问来源于stack exchange,提问作者Apricot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:38:26