You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中求解密度曲线与水平线的交点坐标

提取核密度曲线与水平线交点的x坐标解决方案

这里有一个可行的方案,能精准获取蓝色核密度曲线和黑色水平线的交点x坐标,基于你给出的示例代码进行扩展:

步骤说明

  1. 从Seaborn绘制的核密度图中提取曲线的离散数据点
  2. 通过线性插值计算曲线与目标水平线的交点(曲线是离散的,插值能得到更精确的结果)
  3. 输出结果并可视化验证交点位置

完整代码实现

import numpy as np; np.random.seed(10)
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(color_codes=True)
mean, cov = [0, 2], [(1, .5), (.5, 1)]
x, y = np.random.multivariate_normal(mean, cov, size=50).T

# 绘制核密度图并获取曲线数据
ax = sns.kdeplot(x)
kde_line = ax.lines[0]  # 获取核密度曲线的线对象
x_kde = kde_line.get_xdata()  # 曲线的x坐标数组
y_kde = kde_line.get_ydata()  # 曲线的y坐标数组

# 设定目标水平线的y值
target_y = 0.15

# 寻找跨越目标y值的相邻点对
below_target = y_kde < target_y
# 找到数组中布尔值发生变化的位置(即曲线穿过水平线的位置)
crossing_indices = np.where(np.diff(below_target))[0]

# 对每个交叉点进行线性插值计算精确的x坐标
intersection_x = []
for idx in crossing_indices:
    x1, x2 = x_kde[idx], x_kde[idx+1]
    y1, y2 = y_kde[idx], y_kde[idx+1]
    # 线性插值公式:x = x1 + (y_target - y1) * (x2 - x1)/(y2 - y1)
    x_interp = x1 + (target_y - y1) * (x2 - x1) / (y2 - y1)
    intersection_x.append(x_interp)

# 输出结果
print(f"两个交点的x坐标:{np.round(intersection_x, 4)}")

# 可视化验证:标记交点
plt.scatter(intersection_x, [target_y]*2, color='red', s=50, zorder=5, label='交点')
plt.axhline(y=target_y, color='black', linestyle='-', label=f'y={target_y}')
plt.legend()
plt.show()

代码解释

  • ax.lines[0]:Seaborn的kdeplot会在Axes对象中添加一条线,我们直接获取这条线的实例来提取曲线的原始数据
  • np.diff(below_target):通过对比相邻点是否在水平线上下,快速定位曲线穿过水平线的大致位置
  • 线性插值:因为曲线是由离散点组成的,直接取最近点会有误差,用线性插值能得到更接近真实交点的x值

运行这段代码后,你会得到两个交点的精确x坐标,同时图中会用红色圆点标记出交点位置,方便你验证结果是否正确。

内容的提问来源于stack exchange,提问作者Rom M

火山引擎 最新活动