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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 00:22:43