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

