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

如何在ggplot中生成与R基础绘图一致的凸包多边形?

在ggplot中绘制仅包含最大经纬度点的凸包

我来帮你搞定这个问题~

为什么基础绘图和ggplot的结果不一样?

你在基础绘图里能得到理想的凸包,大概率是因为你手动筛选了目标点(也就是那些最大经纬度的点),再用chull()计算这些子集的凸包顶点;但ggplot默认的stat_chull()会对传入的全部数据点计算凸包,所以得到的是覆盖所有20个点的凸多边形,自然和你要的效果不一样。

解决办法:只针对目标子集计算凸包

你只需要在ggplot里指定凸包的计算对象是你筛选出的“最大经纬度点”就行,有两种简单的实现方式:

方法1:提前筛选出目标子集再绘图

先从你的数据里提取符合条件的点(比如这里我假设“最大经纬度”是指经度和纬度都排在前20%的点,你可以根据自己的需求调整筛选逻辑),再用这个子集绘制凸包:

library(ggplot2)
library(dplyr)

# 假设你的数据框叫df,包含lon(经度)、lat(纬度)、density(密度)列
# 筛选出经度和纬度都在前20%的点
top_lon_lat_points <- df %>%
  filter(lon > quantile(lon, 0.8), lat > quantile(lat, 0.8))

# 绘制图形
ggplot(df, aes(x = lon, y = lat)) +
  geom_point(aes(color = density)) +  # 绘制所有原始点,用密度着色
  # 用筛选后的子集绘制凸包
  geom_polygon(data = top_lon_lat_points, aes(group = 1),
               stat = "chull", fill = NA, color = "red", size = 1)

方法2:直接在stat_chull里指定子集

如果你不想额外创建新数据框,可以直接在stat_chull()里用subset参数筛选目标点,一步到位:

ggplot(df, aes(x = lon, y = lat)) +
  geom_point(aes(color = density)) +
  stat_chull(aes(group = 1),
             # 这里的筛选逻辑和方法1一致,你可以按需修改
             subset = .(lon > quantile(lon, 0.8) & lat > quantile(lat, 0.8)),
             fill = NA, color = "red", size = 1)

小提示

你可以根据自己的实际需求调整筛选条件:比如如果是要取经度最大的10个点,就改成lon >= sort(lon, decreasing = TRUE)[10];如果是要同时满足经度最大和纬度最大的点,就调整逻辑运算符即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:35:35