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

如何将Seaborn柱状图中的垂直标签居中对齐?

解决Seaborn柱状图垂直文本标签偏左的问题

问题原因

你遇到的标签偏左问题,是因为使用hue参数后,Seaborn会调整柱子的宽度和位置,你手动指定的x坐标(0、1等)并非柱子的实际中心位置;另外当文本旋转90度时,对齐逻辑也会和水平文本略有差异。

两种解决方案

方案1:获取柱子实际位置精准放置文本(推荐)

通过ax.patches获取每个柱子的位置和宽度,计算出中心坐标后放置文本,能确保完全居中,适配任意柱子宽度:

import matplotlib.pyplot as plt
import seaborn as sns

percentages = [8.46950845e+00, 1.58712232e+01, 2.13963086e+01, 2.33865318e+01, 2.04539820e+01, 1.41358888e+01, 7.79622697e+00, 3.49245775e+00, 1.28729140e+00, 3.91327891e-01, 9.80073446e-02, 2.02461563e-02, 3.46222120e-03, 4.92413036e-04, 5.82500571e-05, 5.70562340e-06, 4.59952409e-07, 3.05322729e-08, 1.57123083e-09, 4.80936609e-11]

plt.figure(figsize=(9, 5), dpi=100)
ax = sns.barplot(
    x = range(1, len(percentages) + 1),
    y = percentages,
    legend=False,
    hue = range(1, len(percentages) + 1),
    palette="GnBu_d"
)

# 定义需要添加的标签,其余柱子留空
labels = ["Additive", "Additive x Additive"] + [""]*(len(percentages)-2)

# 遍历每个柱子,添加对应标签
for patch, label, pct in zip(ax.patches, labels, percentages):
    if label:
        # 计算柱子的中心x坐标和垂直居中的y坐标
        center_x = patch.get_x() + patch.get_width() / 2
        center_y = pct / 2
        ax.text(center_x, center_y, label, ha="center", va="center", rotation=90, fontsize=10, weight="bold")

plt.show()

方案2:手动微调x坐标

如果只需要给少数柱子加标签,可以直接在原x坐标基础上添加偏移量(默认柱子宽度为0.8,所以偏移0.4即可到中心):

import matplotlib.pyplot as plt
import seaborn as sns

percentages = [8.46950845e+00, 1.58712232e+01, 2.13963086e+01, 2.33865318e+01, 2.04539820e+01, 1.41358888e+01, 7.79622697e+00, 3.49245775e+00, 1.28729140e+00, 3.91327891e-01, 9.80073446e-02, 2.02461563e-02, 3.46222120e-03, 4.92413036e-04, 5.82500571e-05, 5.70562340e-06, 4.59952409e-07, 3.05322729e-08, 1.57123083e-09, 4.80936609e-11]

plt.figure(figsize=(9, 5), dpi=100)
ax = sns.barplot(
    x = range(1, len(percentages) + 1),
    y = percentages,
    legend=False,
    hue = range(1, len(percentages) + 1),
    palette="GnBu_d"
)

# 给x坐标添加0.4的偏移,使文本居中
plt.text(0+0.4, percentages[0]/2, "Additive", ha="center", va="center", rotation=90, fontsize=10, weight="bold")
plt.text(1+0.4, percentages[1]/2, "Additive x Additive", ha="center", va="center", rotation=90, fontsize=10, weight="bold")

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 09:23:12