我正在尝试使用渐变配色方案创建一张地图,用于显示每个州因枪击事件造成的死亡人数。我的数据集包含所有 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))
然而,结果如下。
如何编辑我的代码,以便显示实际颜色,以便死亡人数越高,颜色越深,反之亦然?有没有办法添加标签,当您将鼠标悬停在该州时,它会显示州名称和死亡人数?
提前致谢。
这里有几个问题:
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))