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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:00:49