如何在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
相关产品推荐
相关产品推荐

