Создание карты градиента с использованием ggplot2, где местоположения — это сокращенные штаты США

Я пытаюсь создать карту, используя градиентную цветовую схему для количества погибших в каждом штате в результате перестрелок. В моем наборе данных есть все 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))

Однако результат таков.

Как я могу отредактировать свой код, чтобы отображались реальные цвета: чем выше количество погибших, тем темнее цвет, и наоборот? Есть ли способ добавить метки, где при наведении курсора на штат будут отображаться название штата и количество погибших?

Заранее спасибо.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть пара проблем:

  • вы пытаетесь объединить map_data$region, который имеет полные имена состояний, с Fatality_by_state$state, который имеет двухбуквенные сокращения, например они не совпадают и приведут к значениям NA;
  • Я полагаю, у вас есть данные по несмежным штатам? В этом случае было бы лучше включить их;
  • при работе с объектами научной фантастики лучше отображать их как таковые, например. 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))

Результат:

Другие вопросы по теме