在R中为指定1°×1°网格单元叠加颜色的技术实现问题
解决方案
你不需要用stat_density2d,这个函数是做核密度估计的,会生成连续的平滑填充区域,完全不符合你要的离散网格单元需求。直接用geom_rect或者geom_tile就能精准绘制对应左上角点的网格单元,具体步骤如下:
方法1:用geom_rect指定网格边界
因为你的地图设置了lon.interval = 1和lat.interval = 1,每个网格是1×1度的正方形。已知左上角点的经纬度,网格的边界可以直接计算:
- 经度范围:从
long到long+1 - 纬度范围:从
lat-1到lat(纬度向南递减,左上角的纬度值更大)
修改后的代码:
library(ggOceanMaps) library(ggOceanMapsData) dt <- data.frame(lon = c(35, 35, 60, 60), lat = c(-25, -25, -40, -40)) grid_2_colour <- data.frame(lat=c(-29), long=c(50)) basemap(data = dt, bathymetry = TRUE, lon.interval = 1, lat.interval = 1, # bathy.style = "contour_blues", bathy.border.col = NA, bathy.size = 0.1, bathy.alpha = 1) + geom_rect(data = grid_2_colour, aes(xmin = long, xmax = long + 1, ymin = lat - 1, ymax = lat), fill = "#ff4444", # 自定义填充色 alpha = 0.6, # 透明度 color = "#000000") # 网格边框色
方法2:用geom_tile指定中心与尺寸
geom_tile需要网格的中心点坐标,以及宽高。从左上角点推导中心点:
- 中心经度:
long + 0.5 - 中心纬度:
lat - 0.5 - 宽高都设为1,对应1度的网格
代码示例:
basemap(data = dt, bathymetry = TRUE, lon.interval = 1, lat.interval = 1, # bathy.style = "contour_blues", bathy.border.col = NA, bathy.size = 0.1, bathy.alpha = 1) + geom_tile(data = grid_2_colour, aes(x = long + 0.5, y = lat - 0.5), width = 1, height = 1, fill = "#44aaee", alpha = 0.6, color = "#000000")
批量处理多个网格
如果有多个需要上色的网格,只需要在grid_2_colour里添加更多行即可,比如:
grid_2_colour <- data.frame(lat=c(-29, -30, -28), long=c(50, 51, 49))
上述两种方法都会自动为每个左上角点绘制对应的网格单元。
内容的提问来源于stack exchange,提问作者J_S_Moss
相关产品推荐
相关产品推荐

