Python如何提取seaborn 2D kdeplot层级数据并计算轮廓轴极值?
2D双变量Seaborn KDEplot绘图数据提取方案
2D双变量输入的kdeplot完全可以提取对应绘图数据,提取逻辑和1D场景存在本质差异,这也是之前访问kde.lines[0]触发索引越界报错的核心原因。
两类KDE绘图的对象存储差异
- 1D单变量KDE绘图的核心是连续密度曲线,生成的是
Line2D对象,会直接存入Axes对象的lines属性列表,因此可以通过遍历ax.lines直接取曲线的x、y坐标值。 - 2D双变量KDE绘图的核心是密度等值(等高)轮廓,生成的是matplotlib的
QuadContourSet类型对象,这类对象会存入Axes对象的collections属性列表,不会进入lines列表,因此直接访问ax.lines取不到对应数据。
具体实现步骤
1. 修复基础代码的拼写笔误
原测试代码中np.randon为拼写错误,正确调用为np.random,否则会触发属性不存在的报错:
import numpy as np import matplotlib from seaborn import kdeplot lA = np.random.normal(1, 0.2, 1000) ld = np.random.normal(1, 0.2, 1000) ax = kdeplot(x=lA, y=ld)
2. 提取2D KDE对应的轮廓集
筛选Axes的collections列表中属于QuadContourSet的对象,即可拿到当前kdeplot绘制的所有等高轮廓:
# 匹配2D KDE生成的等值轮廓集 contour_sets = [ coll for coll in ax.collections if isinstance(coll, matplotlib.contour.QuadContourSet) ] target_contour = contour_sets[0]
3. 遍历所有轮廓点完成极值计算
遍历每个轮廓路径的顶点坐标,收集所有轮廓的x、y方向坐标,即可计算对应方向的最大、最小值,满足离散度衡量的需求:
all_x, all_y = [], [] for path in target_contour.get_paths(): # 路径顶点为轮廓线上的所有坐标点 vertices = path.vertices all_x.extend(vertices[:, 0]) all_y.extend(vertices[:, 1]) # 计算所有轮廓在坐标轴方向的极值 x_dispersion_range = (min(all_x), max(all_x)) y_dispersion_range = (min(all_y), max(all_y))
注意事项
- 如果Axes上同时绘制了多组不同样本的2D KDE轮廓,可以根据对象的label、绘制层级匹配目标轮廓集,避免混入其他绘图的坐标数据。
- 可在调用
kdeplot时通过levels、thresh参数自定义需要绘制的等值轮廓层级,上述提取逻辑不受绘图参数影响。
内容的提问来源于stack exchange,提问作者Edgar Peralta
相关产品推荐
相关产品推荐

