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

使用ggplot2绘制美国州缩写映射的枪击致死数渐变地图求助

问题分析与解决方案

你的代码主要有两个核心问题:一是州名格式不匹配导致数据关联失败,二是原生ggplot不支持悬停交互。以下是具体修改方案:

1. 核心问题拆解

  • 州名匹配错误:map_data("state")返回的region是小写的州全称(如"alabama"),但你的数据集用的是双字母缩写(如"AL"),直接合并会导致n全为NA,自然无法显示渐变色彩。
  • 缺乏交互支持:原生ggplot仅支持静态可视化,需要借助plotly实现悬停标签功能。

2. 修改后的完整代码

library(maps)
library(dplyr)
library(mapproj)
library(plotly)
library(stringr)

# 构建州缩写 -> 小写全称的映射表(含华盛顿特区)
state_mapping <- tibble(
  abb = c(state.abb, "DC"),
  region = c(tolower(state.name), "district of columbia")
)

# 转换数据集的州格式,匹配地图数据规范
fatalities_by_state <- shootings_clean %>%
  count(state) %>%
  left_join(state_mapping, by = c("state" = "abb"))

# 获取包含华盛顿特区的美国地图数据
map_data <- map_data("state") %>%
  bind_rows(map_data("state", region = "district of columbia"))

# 合并地图与致死数据,处理缺失值(将无数据的州设为0)
merged_data <- map_data %>%
  left_join(fatalities_by_state, by = "region") %>%
  mutate(n = replace_na(n, 0))

# 绘制静态地图,同时定义交互标签内容
p <- ggplot() +
  geom_polygon(
    data = merged_data,
    aes(
      x = long, y = lat, group = group,
      fill = n,  # 用原始致死数做渐变依据,如需对数刻度可改为log(n+1)
      text = paste(
        "州名:", str_to_title(region),
        "\n致死事件数:", n
      )
    ),
    color = "black", size = 0.2
  ) +
  theme_classic() +
  scale_fill_gradient(
    low = "lightblue", high = "darkblue",
    name = "致死事件数", na.value = "gray"
  ) +
  coord_map() +
  labs(title = "美国各州枪击致死事件数", fill = "致死事件数") +
  theme(plot.title = element_text(hjust = 0.5))

# 转换为可交互地图,启用悬停标签
ggplotly(p, tooltip = "text")

3. 关键修改说明

  • 州名匹配修复:利用R内置的state.abb/state.name向量构建映射,将双字母缩写转换为地图数据需要的小写全称,确保数据能正确关联。
  • 华盛顿特区支持:单独获取DC的地图数据并合并,同时在映射表中加入"DC"的对应关系。
  • 缺失值处理:用replace_na将无致死数据的州填充为0,避免渐变色彩失效;若需保留缺失状态,可改为na.value = "gray"标注。
  • 交互功能实现:在aes中定义text参数设置悬停内容,再通过ggplotly()将静态图转换为可交互可视化,指定tooltip = "text"显示自定义标签。
  • 渐变色彩优化:直接使用原始致死数n做填充依据,如需压缩数值跨度,可改为log(n+1)(避免log(0)报错)。

内容的提问来源于stack exchange,提问作者prina sikowitz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:56:13