使用 ggplot2 创建梯度图,其中位置是美国各州的缩写

问题描述 投票:0回答:1

我正在尝试使用渐变配色方案创建一张地图,用于显示每个州因枪击事件造成的死亡人数。我的数据集包含所有 50 个州 + DC,并且每个州使用两个字母缩写。我在下面创建了一个变量来计算每个状态的事件数量。

使用这个,我试图制作一张地图,其中计数较高的州用深蓝色着色,计数较低的州用浅蓝色着色。

library(maps)
library(dplyr)
library(mapproj)

fatalities_by_state <- shootings_clean %>%
  count(state)

map_data <- map_data("state")

merged_data <- merge(map_data, fatalities_by_state, by.x = "region", by.y = "state", all.x = TRUE)

ggplot() +
  geom_polygon(data = merged_data,
               aes(x = long, y = lat, group = group, fill = log(n)),
               color = "black", size = 0.2) +
  theme_classic() + 
  scale_fill_gradient(low = "lightblue", high = "darkblue", name = "Fatalities") +
  coord_map() +
  labs(title = "Fatalities by State", fill = "Log Count") +
  theme(plot.title = element_text(hjust = 0.5))

然而,结果如下。

如何编辑我的代码,以便显示实际颜色,以便死亡人数越高,颜色越深,反之亦然?有没有办法添加标签,当您将鼠标悬停在该州时,它会显示州名称和死亡人数?

提前致谢。

r ggplot2 gradient colormap
1个回答
0
投票

这里有几个问题:

  • 您正在尝试将具有完整州名称的map_data$region与具有两个字母缩写的fatality_by_state$state合并,例如它们不匹配,将导致 NA 值;
  • 我猜您有非连续状态的数据?在这种情况下,最好将它们包括在内;
  • 使用 sf 对象时,最好将它们绘制成这样,例如
    geom_sf()

这是解决这些问题的完整代表。如果您想省略非连续状态,请在下面发表评论,我将更新答案。另外,如果您想知道如何创建交互式地图,这应该是一个单独的问题。但您不需要发布单独的问题,只需搜索与使用

plotly
包绘制 sf 对象相关的问题即可。 SO 上有很多
plotly
解决方案。其他选项包括使用
leaflet
mapview
,它们使用起来相对简单。

library(dplyr)
library(sf)
library(usmap)
library(ggplot2)

# US state data as sf object from the usmap library
map_data <- us_map() %>%
  rename(state = "abbr")

# Create example fatalities data
set.seed(1)
fatalities_by_state <- data.frame(state = map_data$state,
                                  n = sample(59:1700, 51))
# Join
merged_data <- left_join(map_data, fatalities_by_state, by = "state")

# Plot
ggplot() +
  geom_sf(data = merged_data,
          aes(fill = log(n)),
          color = "black",
          linewidth = 0.2) +
  theme_classic() + 
  scale_fill_gradient(low = "lightblue", 
                      high = "darkblue", 
                      name = "Fatalities\nLog Count") +
  labs(title = "Fatalities by State") +
  theme(plot.title = element_text(hjust = 0.5))

结果:

© www.soinside.com 2019 - 2024. All rights reserved.