Python Pandas/Matplotlib:标注99%置信区间外的Org值
标注99%置信区间外的Org值的简便方法
当然有很简便的方式实现这个需求!咱们可以结合 pandas 的数据筛选和 matplotlib 的文本标注功能来快速搞定,下面分两种常用的方式给你演示:
方法一:基于DataFrame直接筛选标注
这种方式更直观,直接在你的DataFrame里找出超出区间的行,然后逐个标注:
# 先在你原有绘图代码的基础上,添加这段标注逻辑 plt.figure(figsize=(15,8)) plt.ylim(0, 100) plt.margins(x=0) plt.scatter(x,y,marker='o',c='white',edgecolors = 'black', alpha=.5) plt.plot(x,up95, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,low95, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,up99, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,low99, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,middleLine, 'red', linestyle='-', dashes=(1, 2), linewidth=1) # -------------------------- 新增标注代码 -------------------------- # 筛选出超出99%置信区间的点(注意统一单位:把Upper99/Lower99转成百分比和Success匹配) outliers = sqlDf2[(sqlDf2['Success'] > sqlDf2['Upper99'] * 100) | (sqlDf2['Success'] < sqlDf2['Lower99'] * 100)] # 遍历每个异常点,标注Org值 for _, row in outliers.iterrows(): plt.text( row['Total'], # x坐标 row['Success'], # y坐标 row['Org'], # 要标注的内容 ha='center', va='bottom', # 水平/垂直居中对齐 bbox=dict(facecolor='lightyellow', alpha=0.7) # 可选:添加背景框,让标注更醒目 ) # ------------------------------------------------------------------ plt.show()
方法二:基于数组筛选标注
如果你更习惯用数组操作(和你原有代码风格一致),可以这样做:
# 同样在绘图代码之后添加标注逻辑 plt.figure(figsize=(15,8)) plt.ylim(0, 100) plt.margins(x=0) plt.scatter(x,y,marker='o',c='white',edgecolors = 'black', alpha=.5) plt.plot(x,up95, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,low95, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,up99, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,low99, 'red', linestyle=':', dashes=(1, 5), linewidth=1) plt.plot(x,middleLine, 'red', linestyle='-', dashes=(1, 2), linewidth=1) # -------------------------- 新增标注代码 -------------------------- # 生成异常点的掩码:找出y值超出99%上下限的位置 mask = (y > up99) | (y < low99) # 获取异常点的坐标和对应的Org值 outlier_x = x[mask] outlier_y = y[mask] outlier_orgs = sqlDf2['Org'].values[mask] # 逐个标注 for xi, yi, org in zip(outlier_x, outlier_y, outlier_orgs): plt.text( xi, yi, org, ha='center', va='top', # 调整对齐方式避免和散点重叠 color='darkblue', fontweight='bold' # 自定义标注样式 ) # ------------------------------------------------------------------ plt.show()
可选优化:带箭头的标注
如果担心标注和散点重叠,或者想更清晰地指向对应点,可以用plt.annotate()代替plt.text(),添加箭头指向:
for _, row in outliers.iterrows(): plt.annotate( row['Org'], xy=(row['Total'], row['Success']), # 箭头指向的点 xytext=(row['Total'] + 15, row['Success'] + 3), # 标注文本的位置(偏移一点) arrowprops=dict(arrowstyle='->', color='gray', alpha=0.6), # 箭头样式 fontsize=10 )
这样就能轻松把所有超出99%置信区间的点对应的Org值标注在图上啦~
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

