R语言ggplot如何绘制按点密度着色的欧洲网格地图
答复
可行性结论
完全可以通过ggplot2实现目标效果:生成覆盖欧洲区域的等尺寸规则网格,按单元格内记录点数量映射填充颜色,效果和参考图一致,且后续自定义调整的灵活度高于levelplot。
具体实现路径
核心逻辑为:先按自定义尺寸生成覆盖研究范围的等间隔规则网格,再空间匹配统计每个网格内的落点总数,最后通过矩形图层绘制网格并叠加底图,全程可在ggplot2生态内完成,不需要依赖其他绘图包。
操作步骤:
- 基于现有清洗完成的陆地有效点数据集,先设定网格尺寸参数,生成覆盖整个欧洲研究区的等尺寸网格,为每个网格分配唯一标识
- 将所有记录点匹配到所属网格,分组统计每个网格内的点数量,将统计结果关联回网格数据集,无点的网格可按需保留或过滤
- 绘图时优先绘制带密度值的网格图层,将填充色映射为点数字段,再叠加国家行政边界图层,调整坐标范围、配色、图例等元素即可
复用代码
在你原有代码运行得到europe_land(仅含陆地有效点的经纬度数据框)、world(世界地图底图数据)的基础上,追加以下代码即可出图:
library(sf) # 网格参数设置,可按需调整 cell_size <- 2 # 网格边长,单位为经纬度度数,修改该值即可调整网格大小 xmin <- -15 xmax <- 45 ymin <- 30 ymax <- 75 # 生成覆盖研究区的规则网格 x_breaks <- seq(xmin, xmax, by = cell_size) y_breaks <- seq(ymin, ymax, by = cell_size) grid_df <- expand.grid( xmin = x_breaks[-length(x_breaks)], ymin = y_breaks[-length(y_breaks)] ) %>% mutate( xmax = xmin + cell_size, ymax = ymin + cell_size, grid_id = row_number() ) # 统计每个网格内的点数量 europe_land <- europe_land %>% mutate( x_grid = floor((long - xmin)/cell_size)*cell_size + xmin, y_grid = floor((lat - ymin)/cell_size)*cell_size + ymin ) grid_count <- europe_land %>% count(x_grid, y_grid, name = "point_count") grid_df <- grid_df %>% left_join(grid_count, by = c("xmin" = "x_grid", "ymin" = "y_grid")) %>% mutate(point_count = tidyr::replace_na(point_count, 0)) %>% filter(point_count > 0) # 过滤无点的海洋网格,不需要可删除该行 # 绘制最终图件 ggplot() + geom_rect( data = grid_df, aes(xmin = xmin, xmax = xmax, ymin = ymin, ymax = ymax, fill = point_count), color = NA, alpha = 0.8 ) + geom_map( data = world, map = world, aes(long, lat, map_id = region), color = "white", fill = NA, linewidth = 0.2 ) + # 可替换为其他fill标度调整配色 scale_fill_viridis_c(name = "记录点数量", direction = -1) + coord_sf(xlim = c(xmin, xmax), ylim = c(ymin, ymax), expand = FALSE) + theme_minimal() + labs(x = "经度", y = "纬度")
调整说明
- 修改
cell_size的赋值即可自由调整网格大小,所有网格始终保持等尺寸 - 替换
scale_fill_viridis_c为其他填充标度(如scale_fill_gradient)可自定义配色,匹配参考图的色彩风格 - 若需要网格严格贴合陆地边界、剔除网格中海域部分的填充,可将网格转为sf矢量对象后,与欧洲陆地边界做相交裁剪即可
内容的提问来源于stack exchange,提问作者J. Lan
相关产品推荐
相关产品推荐

