如何在Python条形图上叠加中位数标记圆点
在分组条形图的FDLE组添加中位数圆点的解决方案
要在FDLE组的每个条形对应位置添加中位数圆点,核心是找准FDLE组每个条形的x轴坐标——之前用scatter失败大概率是x坐标没匹配到FDLE条形的实际位置。以下是具体实现方案:
关键逻辑说明
- 分组条形图的x轴偏移规则:每个类别的多个条形,是通过对原始x坐标加减条形宽度来定位的。比如FDLE作为第一组,它的x坐标通常是
原始x - 条形宽度(具体偏移量取决于你代码中的分组顺序)。 - 确保
medf数组长度与类别数量一致,每个元素对应FDLE组对应类别的中位数。 - 用
scatter绘制圆点时,设置合适的标记样式、颜色,并通过zorder参数让圆点显示在条形上方。
完整示例代码
import matplotlib.pyplot as plt import numpy as np # 替换成你的实际数据 categories = ['类别1', '类别2', '类别3', '类别4'] # x轴类别 fdle_data = [14, 22, 18, 25] # FDLE组条形高度 calu3_data = [16, 20, 21, 23] # CALU-3组数据 rle6tn_data = [12, 24, 17, 26] # RLE-6TN组数据 medf = [15, 21, 19, 24] # FDLE组中位数数组 bar_width = 0.25 x = np.arange(len(categories)) # 原始x坐标(每个类别的中心位置) fig, ax = plt.subplots() # 绘制三组条形:注意FDLE组的x坐标是x - bar_width ax.bar(x - bar_width, fdle_data, bar_width, label='FDLE') ax.bar(x, calu3_data, bar_width, label='CALU-3') ax.bar(x + bar_width, rle6tn_data, bar_width, label='RLE-6TN') # 在FDLE组对应位置绘制中位数圆点 ax.scatter(x - bar_width, medf, color='darkred', marker='o', s=60, zorder=10, label='FDLE 中位数') # 常规图表设置 ax.set_xticks(x) ax.set_xticklabels(categories) ax.legend() plt.ylabel('数值') plt.title('分组条形图(含FDLE中位数标记)') plt.show()
常见问题排查
- 圆点不显示:检查
medf的数值是否在y轴范围内,或调高zorder值(数值越大越靠上); - 圆点位置偏移:核对FDLE组的x坐标偏移是否和你代码中的一致(比如如果你的FDLE组是用
x + bar_width绘制的,scatter的x参数也要对应修改); - 维度错误:确保
medf的长度和categories的长度完全相同。
内容的提问来源于stack exchange,提问作者makenzie
相关产品推荐
相关产品推荐

