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

如何解决tmap中部分国家缺失与数据错位问题?

解决tmap地图数据错位与美国缺失问题

嘿,我来帮你搞定这个让人头疼的地图错位问题!你遇到的美国缺失、越南/卢旺达数据错位的核心原因,是合并数据时打乱了空间对象的行顺序,导致属性表和几何图形不匹配——这是用传统sp对象合并时很容易踩的坑。

问题根源

你直接用merge()合并World@data,但这个函数会根据合并键(iso_a3/iso3)重新排序属性表,可World这个sp对象的几何部分(World@polygons)还是保持原来的顺序。结果就是:属性表的第n行不再对应几何图形的第n个多边形,自然出现数据错位,美国的属性如果匹配不上,就会显示缺失,其他国家的数据“跑”到错误的位置。

解决方案(推荐用sf格式,更稳定)

现在tmap对sf格式支持非常好,用sf处理空间数据合并能避免行序错位问题,步骤如下:

# 加载所需包
library(tmap)
library(countrycode)
library(dplyr)
library(sf)

# 预处理自有数据:生成iso3编码并去除NA
df$iso3 <- countrycode(df$country, 'name', 'iso3c')
df <- na.omit(df)

# 加载World数据并转换为sf格式(核心:sf将几何作为属性一部分,合并时不会错位)
data(World)
World_sf <- sf::st_as_sf(World)

# 合并数据:用left_join保持原几何顺序,确保属性和图形一一对应
World_merged <- dplyr::left_join(World_sf, df, by = c("iso_a3" = "iso3"))

# 绘制地图
map <- tm_shape(World_merged) + 
  tm_polygons("1950", title = "Pop Class", palette = "Blues", contrast = 0.7, border.col = "gray30", id = "name") + 
  tm_text("iso_a3", size = "AREA", col = "gray30", root = 3) + 
  tm_format_World() + 
  tm_style_gray()

# 切换到绘图模式并展示
tmap_mode("plot")
map

如果你坚持用传统sp对象的修复方法

如果不想转sf,需要在合并后手动将属性表恢复到原几何的行顺序:

# 加载数据
data(World)
# 先保存原World@data的行名(用于后续恢复顺序)
original_rownames <- rownames(World@data)

# 合并数据(和你原来的步骤一样)
World@data <- merge(World@data, df, by.x = "iso_a3", by.y = "iso3", all.x = TRUE)

# 关键:按原行名重新排序空间对象,让属性和几何匹配
World <- World[match(original_rownames, rownames(World@data)), ]

# 之后再绘制地图即可
map <- tm_shape(World)+ tm_polygons("1950", title = "Pop Class", palette = "Blues", contrast = 0.7, border.col = "gray30", id = "name")+ tm_text("iso_a3", size = "AREA", col = "gray30", root =3)+ tm_format_World()+ tm_style_gray()
tmap_mode("plot")
map

额外检查:iso3编码一致性

还要确认你的df中美国的iso3编码是"USA"——有时候countrycode对国家名称的匹配可能出问题(比如名称是"United States of America"而非"United States"),可以手动验证:

# 检查美国的iso3编码
df$iso3[df$country == "United States"]
# 如果匹配错误,用custom_match强制指定
df$iso3 <- countrycode(df$country, 'name', 'iso3c', 
                       custom_match = c("United States" = "USA", "Vietnam" = "VNM", "Rwanda" = "RWA"))

这样处理后,应该就能解决数据错位和美国缺失的问题啦!

内容的提问来源于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.21 03:50:46