如何将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
相关产品推荐
相关产品推荐

