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

R语言stat_density2d函数高亮多网格而非单个的问题排查

问题描述

尝试在地图上高亮单个1x1度的网格方块。前3个网格可正常高亮单个方块,但高亮第4个网格后,stat_density2d函数开始高亮多组方块,不清楚原因。代码如下:

library(ggOceanMaps)
#devtools::install_github("MikkoVihtakari/ggOceanMapsData")
library(ggOceanMapsData)

dt <- data.frame(lon = c(35, 35, 60, 60), lat = c(-25, -25, -40, -40))

grid_2019_1 <- data.frame(lat=c(-28, -29), long=c(51, 52))
grid_2019_2 <- data.frame(lat=c(-28, -29), long=c(52, 53))
grid_2019_3 <- data.frame(lat=c(-28, -29), long=c(53, 54))
grid_2019_4 <- data.frame(lat=c(-30, -31), long=c(41, 42))
grid_2019_5 <- data.frame(lat=c(-30, -31), long=c(42, 43))

P4 = basemap(data = dt,bathymetry = T,
        lon.interval = 1,
        lat.interval = 1,
        bathy.style = "contour_blues",
        bathy.border.col = NA,
        bathy.size = 0.1,
        bathy.alpha = 1) 

P4.1 = P4 + stat_density2d(data = grid_2019_1, aes(x = long, y = lat, fill = ..density..),
                    geom = 'tile', contour = F) 
P4.2 = P4.1 + stat_density2d(data = grid_2019_2, aes(x = long, y = lat, fill = ..density..),
                           geom = 'tile', contour = F) 
P4.3 = P4.2 + stat_density2d(data = grid_2019_3, aes(x = long, y = lat, fill = ..density..),
                           geom = 'tile', contour = F) 

P4.4 = P4.3 + stat_density2d(data = grid_2019_4, aes(x = long, y = lat, fill = ..density..),
                           geom = 'tile', contour = F) 
P4.5 = P4.4 + stat_density2d(data = grid_2019_5, aes(x = long, y = lat, fill = ..density..),
                           geom = 'tile', contour = F) 
问题原因

stat_density2d的设计目的是计算并可视化二维数据的密度分布,而非绘制固定范围的矩形网格。你用两个对角点定义网格,前几个案例只是巧合让密度计算生成的tile刚好覆盖目标1x1区域;但当目标网格位置变化后,密度核函数的计算范围、默认bin参数会导致生成多个tile,而非单个方块。

解决办法

改用geom_rect直接绘制固定范围的矩形网格,这才是绘制指定1x1度方块的正确方式。调整代码如下:

首先重新整理网格数据,每个网格明确xmin, xmax, ymin, ymax(对应经度、纬度的范围):

library(ggOceanMaps)
library(ggOceanMapsData)

dt <- data.frame(lon = c(35, 35, 60, 60), lat = c(-25, -25, -40, -40))

# 重新定义网格数据,每行代表一个1x1度的方块
grid_data <- data.frame(
  xmin = c(51, 52, 53, 41, 42),
  xmax = c(52, 53, 54, 42, 43),
  ymin = c(-29, -29, -29, -31, -31),
  ymax = c(-28, -28, -28, -30, -30)
)

P4 <- basemap(data = dt, bathymetry = T,
              lon.interval = 1,
              lat.interval = 1,
              bathy.style = "contour_blues",
              bathy.border.col = NA,
              bathy.size = 0.1,
              bathy.alpha = 1) 

# 用geom_rect一次性添加所有网格,也可分多次添加
P4_final <- P4 + 
  geom_rect(data = grid_data, 
            aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax),
            fill = "red", alpha = 0.5) # 可自行调整填充色和透明度

这样就能精准绘制每个1x1度的网格方块,不会出现密度计算导致的多tile问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:40:30