R语言绘制德国地图出现空白区域问题排查求助
R语言绘制德国区域地图出现空白区域的问题排查
问题背景
使用R语言绘制德国区域地图时,地图上存在空白区域,但对应区域的业务数据是可用的。空白区域表现为地图上部分区域未填充颜色;合并前的业务数据文件为summery_table_GG_R.xlsx;使用的地理数据为gadm3.6版本的德国一级行政区空间数据,获取代码:
URL <- "https://biogeo.ucdavis.edu/data/gadm3.6/Rsp/gadm36_DEU_1_sp.rds"
数据处理及绘图代码如下:
# 数据处理 germany <- readRDS(url(URL)) germany <- fortify(germany) # 绘图 df_Karte_ratio %>% ggplot(aes(x = long, y = lat, group = group, fill = ratio_fl_arzt ))+ geom_polygon(col = "black") + coord_map()+ facet_grid(~EP01_KJP02_BEIDE03_PSM_04_20)+ labs(title = "Fälle-Arzt Verhältnis")+ theme_map()+ theme( legend.position = "right", legend.title = element_blank())+ scale_fill_continuous_sequential(palette = "BluYl")
可能的原因及排查方向
1. 区域标识符匹配错误
地理数据与业务数据的区域编码/名称不匹配是最常见的原因:
- 查看
gadm36_DEU_1_sp.rds的属性数据(sp对象的@data部分),其中的NAME_1列是德国各州的德语名称,检查业务数据中对应的区域名称是否完全一致(包括大小写、德语特殊字符,比如ä/ö/ü,以及拼写差异)。 - 使用
fortify()处理sp对象时,会丢失原有的属性信息(比如区域名称),如果合并数据时没有正确关联这些信息,会导致部分区域无法匹配到业务数据,绘图时显示空白。
2. 数据合并方式错误
检查df_Karte_ratio的生成过程:
- 如果合并地理数据与业务数据时使用了
inner_join,会只保留双方都匹配的区域,地理数据中未匹配到的区域会被丢弃,绘图时就会出现空白。应该使用left_join(以地理数据为基准)确保所有区域都被保留。 - 查看
df_Karte_ratio中ratio_fl_arzt列是否存在NA值,NA会导致对应区域无法填充颜色,显示空白。
3. fortify()导致的空间数据结构问题
fortify()是较旧的空间数据处理方法,容易破坏空间对象的属性关联,建议改用sf包处理空间数据:
install.packages("sf") library(sf) library(ggplot2) # 读取sf格式的地理数据 germany_sf <- read_sf(url("https://biogeo.ucdavis.edu/data/gadm3.6/Rsp/gadm36_DEU_1_sp.rds")) # 假设业务数据通过NAME_1列关联,合并时保留所有地理区域 df_Karte_ratio_sf <- merge(germany_sf, your_business_data, by = "NAME_1", all.x = TRUE) # 用geom_sf绘图 ggplot(df_Karte_ratio_sf) + geom_sf(aes(fill = ratio_fl_arzt), color = "black") + facet_grid(~EP01_KJP02_BEIDE03_PSM_04_20) + labs(title = "Fälle-Arzt Verhältnis") + theme_map() + theme(legend.position = "right", legend.title = element_blank()) + scale_fill_continuous_sequential(palette = "BluYl")
4. 分面变量导致的子数据缺失
你使用了facet_grid(~EP01_KJP02_BEIDE03_PSM_04_20)进行分面绘图:
- 检查每个分面对应的子数据,确认某个分面下是否存在区域的
ratio_fl_arzt值缺失的情况,即使总数据中有该区域的数据,分面子数据缺失也会导致对应区域空白。
5. 绘图分组错误
ggplot中使用group = group来绘制多边形,如果df_Karte_ratio中的group列在合并后出现缺失或错误,会导致多边形无法正确拼接,出现空白区域。可以检查group列的完整性,或者改用sf包的geom_sf(无需手动指定group)。
内容的提问来源于stack exchange,提问作者Giorgi Sebiskveradze
相关产品推荐
相关产品推荐

