如何在R散点图上绘制勾勒峰值的平滑上包络天际线
非均匀散点上沿“天际线”轮廓绘制方法
场景与现有方案局限
- 目标效果:在高密度散点数据集基础上,绘制红色连续线条勾勒散点集的上沿峰值,形成平滑的图表上轮廓效果
- 数据特征:x坐标密集且大多为唯一值,x、y两个坐标轴方向均为非均匀分布,无规则网格结构
- 已尝试方案的缺陷:
- 直接逐点连线的效果极差:由于数据存在大量局部极值,几乎每个点都是局部峰或局部谷,连线后会形成杂乱无章的锯齿
- 单纯提取极值的方法完全不具备可行性:无法得到连续平滑的上轮廓线
- 不适配的现有图表类型:传统等高线图、贝叶斯分析场景下的天际线图,二者的定义与目标效果不匹配
- 已验证无效的复现代码:
load("xy_lidarProfiles.RData") plot(x, y, xlab="x", ylab="y", # 坐标轴标签 pch = 20, # 散点标记样式 asp = 1 # x、y轴宽高比 ) lines(x, y, type="l", col = "red") # 直接连线会生成杂乱锯齿
可落地的实现方法
这类上轮廓绘制的核心逻辑是先过滤散点的局部抖动,再提取连续的上沿边界,最后做平滑处理,可根据数据特征选择以下适配方案:
- 分箱取上界+平滑拟合
- 第一步:按照x坐标的整体取值范围拆分均匀宽度的分箱区间,遍历每个区间内的所有散点,取该区间内y值的最大值作为上轮廓的代表点。分箱宽度根据散点整体密度调整,保证每个区间内至少包含3-5个散点,避免离群值干扰结果。
- 第二步:对所有分箱得到的上轮廓代表点,用
loess局部加权回归做平滑拟合,直接将拟合得到的曲线用红色绘制即可。平滑程度可通过调整loess的span参数控制:需要轮廓更贴近散点峰值就调小span,需要轮廓更舒展流畅就调大span。
- 滑动窗口最大值法
- 匹配散点的整体密度设置滑动窗口的宽度和步长,逐窗口遍历散点集,取每个窗口范围内的y最大值作为轮廓点,将相邻轮廓点依次连线后叠加轻量平滑过滤,就能得到连续的上轮廓线。该方法对非均匀x分布的散点适配性更强。
- 凸包上沿截取法
- 针对LiDAR类高程散点数据,可以先计算散点集的凸包轮廓,剔除凸包结构中位于下沿的边,只保留从最左点到最右点、沿凸包上边缘连接的所有线段,即可得到散点集的最外上轮廓,再做轻度平滑就能达到目标效果。
内容的提问来源于stack exchange,提问作者Honeybear
相关产品推荐
相关产品推荐

