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

