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

如何将自定义数据导入tmap图层并绘制世界人口密度梯度地图

嘿,我来帮你搞定这个世界人口密度地图的问题!你的思路方向是对的,但代码里踩了几个小坑,我一步步给你修正和讲解:

第一步:先把数据和地图正确合并

首先,joinCountryData2Map这个函数会返回一个带属性的空间对象(不管是sp还是sf类型),你得把它存成新变量,比如world_pop,不能直接用原来的df。另外要注意国家名称的匹配问题:你的数据框里列名是Country,所以nameJoinColumn参数得写"Country",你之前写的小写country会导致匹配失败哦!

# 先加载需要的包
library(tmap)
library(maptools) # 旧版本依赖,新版本可能不需要

# 合并自有数据到世界地图模板
world_pop <- joinCountryData2Map(df, 
                                 joinCode = "NAME", 
                                 nameJoinColumn = "Country")

如果之后发现有些国家没匹配上,可以用world_pop$failedJoin查看哪些名称不兼容,手动修正(比如把"US"改成"United States",匹配度会更高)。

第二步:修正绘图代码的错误

你的原代码里有几个冗余和错误的地方:

  • tm_polygons已经包含了填充颜色的功能,不需要额外加tm_fill
  • 填充的字段应该用合并后对象的列名字符串("Population"),而不是直接写df$Population
  • 标题可以改成贴合需求的“Population”,而不是“Income class”

正确的绘图代码如下,我还加了一些优化细节:

# 绘制世界人口密度地图
tm_shape(world_pop) +
  tm_polygons(col = "Population", 
              palette = "-Blues", # 反向蓝色系,数值越高颜色越深
              title = "Population",
              contrast = 0.7,
              border.col = "gray30",
              id = "Country") + # 鼠标hover时显示国家名称
  tm_layout(title = "World Population Distribution", # 添加整体标题
            legend.position = c("right", "bottom")) # 调整图例位置更美观
进阶玩法:用sf对象更灵活(推荐)

如果你的tmap是较新版本,推荐用sf类型的地图数据,结合dplyr合并会更直观:

library(dplyr)
library(sf)

# 把内置World地图转成sf对象
world_sf <- sf::st_as_sf(World)
# 用左连接合并自有数据
world_pop_sf <- world_sf %>%
  left_join(df, by = c("NAME" = "Country"))

# 绘图代码和之前类似
tm_shape(world_pop_sf) +
  tm_polygons(col = "Population",
              palette = "-Blues",
              title = "Population",
              border.col = "gray30") +
  tm_layout(title = "World Population Distribution")

内容的提问来源于stack exchange,提问作者HW-Scientist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:32:02