You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动标记两条绘制曲线的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:32