如何在Matplotlib中指定箭头下方数据占总量的比例并标注
在Matplotlib直方图中计算并标注箭头覆盖区域的数据占比
实现方法与代码示例
1. 准备数据与基础直方图绘制
先生成示例数据,绘制直方图时捕获区间边界和频数——这是计算占比的核心依据:
import numpy as np import matplotlib.pyplot as plt # 生成随机正态分布数据 np.random.seed(42) data = np.random.normal(loc=50, scale=15, size=1000) # 绘制直方图,保存区间边界(bins)和各区间样本数(n) n, bins, patches = plt.hist(data, bins=20, edgecolor='black')
2. 计算目标区域的样本占比
假设箭头覆盖的是数据范围[40, 60],通过筛选直方图区间来统计该范围内的样本总数,再计算占比:
# 定义箭头覆盖的数据范围 target_low = 40 target_high = 60 # 筛选出完全落在目标范围内的直方图区间 mask = (bins[:-1] >= target_low) & (bins[1:] <= target_high) # 统计目标区域的总样本数 target_total = n[mask].sum() # 计算占比(转为百分比) ratio = (target_total / len(data)) * 100
如果目标范围跨区间边界,可调整mask条件为(bins[1:] > target_low) & (bins[:-1] < target_high),确保覆盖所有重叠区间
3. 添加箭头与占比标注
在图表上绘制箭头指向目标区域,并用文本标注计算出的占比:
# 绘制红色箭头指向目标区域中心 plt.arrow(x=50, y=150, dx=0, dy=-50, width=0.5, head_width=2, color='red', zorder=5) # 标注占比,保留两位小数 plt.text(x=55, y=120, s=f'占比: {ratio:.2f}%', fontsize=12, color='red', zorder=6) # 完善图表属性 plt.xlabel('数据值') plt.ylabel('频数') plt.title('直方图及目标区域占比') plt.grid(axis='y', alpha=0.3) plt.show()
手动箭头位置的适配
如果箭头是手动点击或拖拽定位的,需将箭头的像素坐标转换为数据轴坐标,再匹配到对应的直方图区间,重复上述占比计算逻辑即可。
内容的提问来源于stack exchange,提问作者Kirill
相关产品推荐
相关产品推荐

