Я пытаюсь создать карту, используя градиентную цветовую схему для количества погибших в каждом штате в результате перестрелок. В моем наборе данных есть все 50 штатов + округ Колумбия, и для каждого штата используется двухбуквенное сокращение. Ниже я создал переменную, которая подсчитывает количество событий в каждом состоянии.
Используя это, я пытаюсь создать карту, на которой штаты с более высокими значениями окрашены в более темный синий цвет, а штаты с более низкими значениями — в более светлый синий цвет.
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 . Есть много plotly решений для SO. Другие варианты включают использование листовки или карты, которые относительно просты в использовании.
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))
Результат: