stat_density2d()未覆盖全部点的原因及调整方法?
问题:stat_density2d低密度轮廓线未覆盖大量点的调整方法
我尝试用ggplot和stat_density2d()展示自有点图层的分布与密度,代码如下:
p1 <- ggplot()+ stat_density2d(data=tempSSI, aes(x=longitude, y=latitude, fill=after_stat(level)), geom="polygon")+ geom_point(data=tempSSI, aes(x=longitude, y=latitude), fill="red", shape=23, alpha=0.8)
但绘图后发现,低密度区域的轮廓线未覆盖大量点:
调整方法
1. 增加轮廓层级数量
默认的stat_density2d()层级数较少,导致低密度区域的轮廓线无法延伸到边缘点。可以通过bins参数直接增加层级,或者手动指定密度断点breaks:
- 使用
bins参数快速增加层级:
p1 <- ggplot()+ stat_density2d(data=tempSSI, aes(x=longitude, y=latitude, fill=after_stat(level)), geom="polygon", bins=20)+ # 按需调整bins数值,越大层级越多 geom_point(data=tempSSI, aes(x=longitude, y=latitude), fill="red", shape=23, alpha=0.8)
- 手动指定密度断点(更精准控制):
# 先计算数据的核密度分布,生成自定义断点 library(MASS) dens <- kde2d(tempSSI$longitude, tempSSI$latitude) breaks <- seq(min(dens$z), max(dens$z), length.out=20) # 20个层级,可调整 p1 <- ggplot()+ stat_density2d(data=tempSSI, aes(x=longitude, y=latitude, fill=after_stat(level)), geom="polygon", breaks=breaks)+ geom_point(data=tempSSI, aes(x=longitude, y=latitude), fill="red", shape=23, alpha=0.8)
2. 调整核密度估计的带宽
默认带宽可能过于紧凑,导致低密度区域的密度被低估。通过h参数扩大带宽,让核密度估计覆盖更广的范围:
# h的数值需根据经纬度的尺度调整,比如0.5、1等 p1 <- ggplot()+ stat_density2d(data=tempSSI, aes(x=longitude, y=latitude, fill=after_stat(level)), geom="polygon", h=c(0.5, 0.5))+ geom_point(data=tempSSI, aes(x=longitude, y=latitude), fill="red", shape=23, alpha=0.8)
也可以用bandwidth.nrd()自动计算合适的带宽:
h_long <- bandwidth.nrd(tempSSI$longitude) h_lat <- bandwidth.nrd(tempSSI$latitude) p1 <- ggplot()+ stat_density2d(data=tempSSI, aes(x=longitude, y=latitude, fill=after_stat(level)), geom="polygon", h=c(h_long, h_lat))+ geom_point(data=tempSSI, aes(x=longitude, y=latitude), fill="red", shape=23, alpha=0.8)
3. 使用geom_density_2d_filled替代
geom_density_2d_filled是stat_density2d的封装函数,默认会生成更多层级的填充轮廓,更易覆盖低密度区域,代码更简洁:
p1 <- ggplot(tempSSI, aes(x=longitude, y=latitude))+ geom_density_2d_filled(bins=20)+ # 同样可调整bins数量 geom_point(fill="red", shape=23, alpha=0.8)
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

