如何自动标记两条绘制曲线的2-3个最近逼近点?
自动标记两条曲线的最近逼近点思路与实现
嘿,这个需求我之前也碰到过,给你分享个清晰的实现思路,结合你的代码修改就能搞定:
核心步骤拆解
- 量化曲线距离:因为你的两条曲线共用同一个x轴(
dat[:,0]),直接计算两个y值的绝对差,就能直观表示它们在每个x位置的远近 - 筛选最近点:对差值排序,提取最小的2-3个对应的索引,就能拿到这些最近点的坐标
- 可视化强化:用特殊标记把这些点标出来,再加上文字标注,让结果一目了然
修改后的完整代码
import matplotlib.pyplot as plt import numpy as np # 加载数据 dat = np.loadtxt(fname="data.txt") # 计算两条曲线的y值绝对差 y_diff = np.abs(dat[:,1] - dat[:,2]) # 找出差值最小的前3个点的索引(改成2就取前2个) top_closest_indices = np.argsort(y_diff)[:3] # 获取这些最近点的坐标 closest_x = dat[top_closest_indices, 0] closest_y_curve1 = dat[top_closest_indices, 1] closest_y_curve2 = dat[top_closest_indices, 2] # 绘制原始曲线 plt.plot(dat[:,0], dat[:,1], label="Curve 1") plt.plot(dat[:,0], dat[:,2], label="Curve 2") # 标记最近逼近点(用不同形状区分两条曲线,zorder确保点在曲线上方) plt.scatter(closest_x, closest_y_curve1, color="crimson", marker="o", s=80, zorder=5) plt.scatter(closest_x, closest_y_curve2, color="darkblue", marker="s", s=80, zorder=5) # 给每个最近点添加标注(显示x值和距离,避免遮挡) for idx, x in enumerate(closest_x): avg_y = (closest_y_curve1[idx] + closest_y_curve2[idx])/2 distance = y_diff[top_closest_indices[idx]] plt.annotate(f"x={x:.1f}\ndist={distance:.2f}", xy=(x, avg_y), xytext=(x+2, avg_y+0.5), # 标注位置可根据你的数据调整 bbox=dict(boxstyle="round,pad=0.3", fc="white", alpha=0.8), arrowprops=dict(arrowstyle="->", color="gray")) # 保留你原来的竖线和图例设置 plt.axvline(x=35, color='k', linestyle='--',label="closest approach") plt.legend(bbox_to_anchor=(1,1), bbox_transform=plt.gcf().transFigure) plt.tight_layout() plt.show()
额外补充
- 如果你的两条曲线x轴不共用(比如是两组独立的x数据),需要先用
np.interp对其中一条曲线做插值,把它们对齐到同一组x值后再计算差值 - 标注的位置(
xytext参数)可以根据你的数据分布灵活调整,防止遮挡关键曲线区域
内容的提问来源于stack exchange,提问作者JRowing
相关产品推荐
相关产品推荐

