如何解决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
相关产品推荐
相关产品推荐

