使用ggplot绘制巴西暴力死亡数Choropleth地图遇阻,求解决方案
解决巴西各州故意暴力死亡数Choropleth地图着色问题
以下是针对地图未正确着色的核心排查与修复步骤:
核对数据匹配键的一致性
地理数据(GeoJSON)中的州标识符(如codigo_uf、sigla)和你的统计数据集里的州代码,必须是同一格式、同一类型。比如GeoJSON里的州代码是字符串"11",而你的数据集里是数值11,就会导致匹配失败。
修复:用as.character()或as.numeric()统一类型,示例:# 将GeoJSON的州代码转成字符串 geo$state_code <- as.character(geo$codigo_uf) # 将统计数据集的州代码也转成字符串 data$state_code <- as.character(data$state_code)正确合并地理与统计数据
必须把统计数据合并到地理sf对象中,确保连接键对应正确,示例:# 假设geo是加载好的sf对象,data是你的死亡数据集 merged_data <- geo %>% dplyr::left_join(data, by = "state_code") # 检查合并后是否有NA(匹配失败的州) table(is.na(merged_data$vid_2021))如果有NA,逐一核对州代码的对应关系,比如是否有拼写错误、代码格式差异。
修正ggplot的填充映射
绘制时要在geom_sf()里明确指定fill映射到你的死亡数据列,确保用的是合并后的sf对象:ggplot() + geom_sf(data = merged_data, aes(fill = vid_2021), color = "white", linewidth = 0.2) + # 用连续型颜色比例尺,也可根据需求用分箱型scale_fill_viridis_b() scale_fill_viridis_c(option = "magma", name = "2021年故意暴力死亡数") + theme_minimal() + theme(axis.text = element_blank(), axis.title = element_blank())注意:不要把
fill映射放在全局ggplot(aes())里,除非所有图层都包含该数据列。检查数据类型与缺失值
- 确认
vid_2021是数值型:用class(merged_data$vid_2021)查看,若为字符型,用merged_data$vid_2021 <- as.numeric(merged_data$vid_2021)转换。 - 处理缺失值:如果有NA,可在比例尺中指定缺失值颜色:
scale_fill_viridis_c(na.value = "grey70", option = "magma", name = "2021年故意暴力死亡数")
- 确认
验证地理数据加载正常
先单独绘制地理轮廓,确认地图显示正确:ggplot() + geom_sf(data = geo)如果轮廓显示正常,再逐步添加填充映射,定位问题环节。
内容的提问来源于stack exchange,提问作者Giovanni Saboia
相关产品推荐
相关产品推荐

