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

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 23:25:22