如何在tmap中绘制连接各国质心的连线并按总人口设置线样式
用tmap绘制国家质心连线并按总人口和着色
以下是实现需求的完整步骤和代码:
步骤1:预处理数据并计算国家质心
先过滤掉无实际人口的区域(比如南极洲),再计算每个国家的几何质心:
# 过滤无效区域,计算各国质心 world_centroids <- world %>% filter(name != "Antarctica") %>% mutate(centroid = st_centroid(geometry)) %>% select(name, pop, centroid)
步骤2:生成所有国家对组合
创建两两国家的唯一组合,排除自身连接和重复双向连线(比如A→B与B→A):
# 生成仅包含A < B的国家对,减少重复计算 country_pairs <- expand.grid( id1 = 1:nrow(world_centroids), id2 = 1:nrow(world_centroids), stringsAsFactors = FALSE ) %>% filter(id1 < id2) # 合并两国人口数据,计算总人口之和 pair_data <- country_pairs %>% left_join(world_centroids, by = c("id1" = "row.names")) %>% left_join(world_centroids, by = c("id2" = "row.names"), suffix = c("_1", "_2")) %>% mutate(total_pop = pop_1 + pop_2)
步骤3:创建连线的SF对象
将每对质心坐标转换为线要素:
# 生成连线几何对象 lines <- lapply(1:nrow(pair_data), function(i) { st_linestring( x = rbind( st_coordinates(pair_data$centroid_1[i]), st_coordinates(pair_data$centroid_2[i]) ) ) }) %>% st_sfc(crs = st_crs(world)) # 转换为带属性的SF数据框 pair_lines <- st_sf( total_pop = pair_data$total_pop, geometry = lines )
步骤4:用tmap绘制最终地图
叠加底图与连线,用颜色映射总人口之和,优化视觉效果:
# 绘制底图 tm_shape(world %>% filter(name != "Antarctica")) + tm_polygons(col = "yellow", alpha = 0.7) + # 绘制连线,按总人口和着色,调整透明度避免遮挡 tm_shape(pair_lines) + tm_lines( col = "total_pop", alpha = 0.3, lwd = 0.5, palette = "viridis", title.col = "两国总人口之和" ) + tm_layout(legend.position = c("right", "top"))
关键细节说明
- 过滤南极洲可避免生成大量无效连线,同时排除无人口数据的区域
- 保留
id1 < id2的组合能减少一半数据量,提升绘图效率 - 调整
alpha(透明度)和lwd(线宽)可优化密集连线的可视化效果 - 使用
viridis调色盘对色盲友好,且能清晰区分不同人口规模的连线
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

