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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:17:21