如何将自定义数据导入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
相关产品推荐
相关产品推荐

