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

如何在matplotlib直方图子图上添加文本并调整列间距?

实现方案

列间距调整方法

  • 不同列名分组的间距,由生成x坐标时的组偏移系数控制:原预处理代码中i + j * 10 - 1的乘数10就是组间距控制值,调大该值会拉远不同列组的距离,调小则缩近距离
  • 单个分组内部的柱子空隙,通过ax.bar()的width参数控制,柱子宽度越小,组内空隙越大

柱状子图添加文本标注方法

  • 子图添加文本和普通图表逻辑完全一致,直接调用轴实例的ax.text()方法,传入标注点的x/y坐标、显示文本即可
  • 要实现误差值标注效果,只需在每根柱子对应的误差棒顶端位置,把误差值转为字符串渲染,y坐标额外加微小偏移避免和误差线重叠,设置水平居中对齐即可

修正后可运行完整代码

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

# 生成测试数据集
random_data = np.random.randint(10,25,size=(5,3))
df = pd.DataFrame(random_data, columns=['Column_1','Column_2','Column_3'])

# 绘图数据预处理
group_gap = 8  # 调整该值控制不同列组的间距,数值越大组间距越宽
new_df = pd.concat(
    [
        pd.DataFrame(
            {
                "x": [i + j * group_gap - 1 for i in range(1, len(df[col]) + 1)],
                "value": df[col],
                "label": col,
            }
        )
        for j, col in enumerate(df.columns)
    ]
).reset_index(drop=True)

# 计算每组的均值、标准差(原代码缺失该预处理步骤)
mean_df = new_df.groupby(['label','x'])['value'].mean().reset_index()
std_df = new_df.groupby(['label','x'])['value'].std().reset_index()

# 绘图基础配置
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10,6))
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)

# 配置x轴刻度
ax.set_xticks(
    ticks=[
        new_df.loc[new_df["label"] == label, "x"].median()
        for label in new_df["label"].unique()
    ]
)
ax.set_xticklabels(new_df["label"].unique(), fontsize=12)

bar_width = 0.6 # 调整该值控制单根柱子宽度,配合组间距调整组内空隙
# 循环绘制每个列组的柱状图、误差棒,并添加文本标注
for label in new_df["label"].unique():
    x_vals = mean_df.loc[mean_df["label"] == label, "x"]
    y_vals = mean_df.loc[mean_df["label"] == label, "value"]
    y_err = std_df.loc[std_df["label"] == label, "value"]
    
    # 绘制柱状图
    ax.bar(
        x = x_vals, 
        height = y_vals,
        width=bar_width,
        color='#80b1d3',
        edgecolor='black'
    )
    # 绘制误差棒
    err_bar = ax.errorbar(
        x = x_vals, 
        y = y_vals,
        yerr=y_err,
        fmt='none',
        c='black',
        capsize=3
    )
    
    # 添加误差值文本标注
    for x, y, err_val in zip(x_vals, y_vals, y_err):
        ax.text(
            x, 
            y + err_val + 0.5, # y坐标在误差棒顶端再向上偏移0.5,避免遮挡
            f'{err_val:.2f}', # 误差值保留两位小数显示
            ha='center',
            fontsize=9,
            color='black'
        )

ax.legend(handles=[err_bar], labels=['误差棒示例'], loc='upper left' ,bbox_to_anchor=(1, 1))
plt.tight_layout()
plt.show()

参数调整说明

  • 修改group_gap的数值即可快速调整不同列名分组之间的距离
  • 文本标注的y轴偏移量(代码中为+0.5)可根据实际y轴取值范围调整,保证文本不遮挡误差线即可
  • 如果需要标注柱子本身的高度值,只需将文本的y坐标改为y + 0.3,传入柱子高度值即可,逻辑完全一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 17:33:40