Хотите поменять цвета в градиенте на карте хороплетра

У меня есть график, работающий в «choroplethr», но я хотел бы изменить цвета градиента.

В настоящее время минимум является «красным», а максимум — «синим». У меня ситуация, когда минимум — это хорошо, а максимум — плохо, поэтому я бы хотел, чтобы максимум был «красным».

Данные:

df1 <- structure(list(region = c(6001L, 6003L, 6005L, 6007L, 6009L, 
6011L, 6013L, 6015L, 6017L, 6019L, 6021L, 6023L, 6025L, 6027L, 
6029L, 6031L, 6033L, 6035L, 6037L, 6039L, 6041L, 6043L, 6045L, 
6047L, 6049L, 6051L, 6053L, 6055L, 6057L, 6059L, 6061L, 6063L, 
6065L, 6067L, 6069L, 6071L, 6073L, 6075L, 6077L, 6079L, 6081L, 
6083L, 6085L, 6087L, 6089L, 6091L, 6093L, 6095L, 6097L, 6099L, 
6101L, 6103L, 6105L, 6107L, 6109L, 6111L, 6113L, 6115L), value = c(1.6, 
0, 0, 0.2, 0, 0, 0.7, 0.1, 0.1, 1.2, 0.1, 0.3, 0.1, 0.1, 1.4, 
0.2, 0.3, 0, 11.8, 0.2, -0.2, 0, -0.1, 0.5, 0, 0, -0.1, 0.2, 
-0.2, -5, -0.3, 0.1, -1.9, 0.5, -0.1, -2.1, -2.5, -1, -0.5, -0.4, 
0, 0.1, -1.8, 0, 0.3, 0, 0.2, 0.6, -0.5, 0.2, 0.2, 0.1, 0.2, 
0.2, 0.2, -0.8, 0.1, 0.3)), class = "data.frame", row.names = c(NA, 
-58L))

Код:

library(choroplethr)

county_choropleth(df1,
                  legend = "Percent\nOver\nExpected\nBased On\nPopulation",
                  num_colors = 0,
                  state_zoom=c("california"))

Опять же, я бы хотел, чтобы градиент начинался с того, что низкие/отрицательные числа были синими, а более высокие положительные значения были красными.

Я пытался изменить цвета, среди прочего, с помощью RColorBrewer и «scale_color_gradient(low = «blue», high = «red»)», но ничего из того, что я пробовал до сих пор, не помогло.

Постройте отрицательные данные, которые должны работать.

Carl Witthoft 06.09.2024 16:43

Вы упоминаете, что пытались изменить цвета разными способами. Было бы полезно, если бы вы включили код, который вы пробовали, но он не работал. Из-за этого мне трудно понять, связана ли ваша проблема с RColorBrewer или с тем, как применить собственную шкалу к хороплетру. В своем ответе я показываю, как использовать шкалу из принятого ответа, при этом используя хороплетр для создания карты.

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

Ответы 2

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

Хотя choroplethr и др. являются чрезвычайно полезными инструментами для автоматизации процесса сопоставления, часто бывает сложно (или невозможно) добиться желаемых результатов. Я не имею в виду, что не существует способа добиться того, чего вы хотите, используя только choroplethr, но в целом мне легче придерживаться ggplot2.

Имея это в виду, вот альтернатива, которая использует данные, загруженные с помощью пакета tigris. Это загрузит объект sf в R, к которому вы затем сможете dplyr::left_join() добавить свой объект df1. Поскольку значения FIPS представляют собой строки в данных tigris (GEOID), они сначала преобразуются в целые числа, чтобы соответствовать значениям вашего региона.

Затем вы легко сможете применить к своим данным любые ggplot функции. Например, я выбрал theme_void(), так как этот вариант больше всего похож на результат вашего кода.

library(tigris)
library(sf)
library(dplyr)
library(ggplot2)

df1 <- structure(list(region = c(6001L, 6003L, 6005L, 6007L, 6009L, 
6011L, 6013L, 6015L, 6017L, 6019L, 6021L, 6023L, 6025L, 6027L, 
6029L, 6031L, 6033L, 6035L, 6037L, 6039L, 6041L, 6043L, 6045L, 
6047L, 6049L, 6051L, 6053L, 6055L, 6057L, 6059L, 6061L, 6063L, 
6065L, 6067L, 6069L, 6071L, 6073L, 6075L, 6077L, 6079L, 6081L, 
6083L, 6085L, 6087L, 6089L, 6091L, 6093L, 6095L, 6097L, 6099L, 
6101L, 6103L, 6105L, 6107L, 6109L, 6111L, 6113L, 6115L), value = c(1.6, 
0, 0, 0.2, 0, 0, 0.7, 0.1, 0.1, 1.2, 0.1, 0.3, 0.1, 0.1, 1.4, 
0.2, 0.3, 0, 11.8, 0.2, -0.2, 0, -0.1, 0.5, 0, 0, -0.1, 0.2, 
-0.2, -5, -0.3, 0.1, -1.9, 0.5, -0.1, -2.1, -2.5, -1, -0.5, -0.4, 
0, 0.1, -1.8, 0, 0.3, 0, 0.2, 0.6, -0.5, 0.2, 0.2, 0.1, 0.2, 
0.2, 0.2, -0.8, 0.1, 0.3)), class = "data.frame", row.names = c(NA, 
-58L))

# Load counties, join df1 data to counties sf
california_counties <- counties(state = "CA", cb = TRUE, year = 2023) |>
  mutate(GEOID = as.integer(GEOID)) |>
  left_join(df1, by = c("GEOID" = "region"))
# Using FIPS code '06' for state 'CA'

# Create state outline
california <- california_counties |>
  summarise(geometry = st_union(geometry))

# Plot
ggplot() +
  geom_sf(data = california_counties,
          aes(fill = value),
          colour = "grey50") +
  geom_sf(data = california, colour = "black", fill = NA) +
  scale_fill_gradient2(name = "Percent\nOver\nExpected\nBased On\nPopulation",
                       low = "blue",
                       mid = "white",
                       high = "firebrick",
                       midpoint = 0) +
  theme_void()

Именно то, что я искал! Спасибо за указание на пакет «tigris», который определенно поможет мне использовать мои знания о «ggplot2».

Woodstock 06.09.2024 04:01

Ключ в том, чтобы понять, что choroplethr на самом деле делает и возвращает.

Как показывает ответ выше, создание картограмм с помощью ggplot2 включает в себя множество шагов. Choroplethr выполняет все эти шаги за вас (а также другие, например, предупреждает вас о повторяющихся или отсутствующих значениях) и возвращает объект ggplot2.

library(choroplethr)

df1 <- structure(list(region = c(6001L, 6003L, 6005L, 6007L, 6009L, 
                                 6011L, 6013L, 6015L, 6017L, 6019L, 6021L, 6023L, 6025L, 6027L, 
                                 6029L, 6031L, 6033L, 6035L, 6037L, 6039L, 6041L, 6043L, 6045L, 
                                 6047L, 6049L, 6051L, 6053L, 6055L, 6057L, 6059L, 6061L, 6063L, 
                                 6065L, 6067L, 6069L, 6071L, 6073L, 6075L, 6077L, 6079L, 6081L, 
                                 6083L, 6085L, 6087L, 6089L, 6091L, 6093L, 6095L, 6097L, 6099L, 
                                 6101L, 6103L, 6105L, 6107L, 6109L, 6111L, 6113L, 6115L), value = c(1.6, 
                                                                                                    0, 0, 0.2, 0, 0, 0.7, 0.1, 0.1, 1.2, 0.1, 0.3, 0.1, 0.1, 1.4, 
                                                                                                    0.2, 0.3, 0, 11.8, 0.2, -0.2, 0, -0.1, 0.5, 0, 0, -0.1, 0.2, 
                                                                                                    -0.2, -5, -0.3, 0.1, -1.9, 0.5, -0.1, -2.1, -2.5, -1, -0.5, -0.4, 
                                                                                                    0, 0.1, -1.8, 0, 0.3, 0, 0.2, 0.6, -0.5, 0.2, 0.2, 0.1, 0.2, 
                                                                                                    0.2, 0.2, -0.8, 0.1, 0.3)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                    -58L))
choro = county_choropleth(df1,
                      legend = "Percent\nOver\nExpected\nBased On\nPopulation",
                      num_colors = 0,
                      state_zoom=c("california"))
class(choro)
[1] "gg"     "ggplot"

Приятной особенностью ggplot2 является то, что вы можете переопределить существующие функции графика с помощью оператора +. Это означает, что вы можете переопределить масштаб по умолчанию, используемый choroplethr, на масштаб из предыдущего ответа, например:

library(ggplot2)

county_choropleth(df1,
                  legend = "Percent\nOver\nExpected\nBased On\nPopulation",
                  num_colors = 0,
                  state_zoom=c("california")) + 
scale_fill_gradient2(name = "Percent\nOver\nExpected\nBased On\nPopulation",
                       low = "blue",
                       mid = "white",
                       high = "firebrick",
                       midpoint = 0)  

Современные версии ggplot2 даже выдают полезное предупреждение о том, что вы переопределяете масштаб и что используется последний предоставленный масштаб. Например, когда я запускаю этот код, я получаю это сообщение на консоли:

Масштаб для заливки уже присутствует. Добавление еще одного масштаба для заливки, который заменит существующий масштаб.

ИМХО, я думаю, у вас на самом деле было два вопроса. Первым было: «Как создать масштаб/легенду для этой карты?» Второй вопрос: «Как мне заставить хороплетр использовать эту шкалу/легенду?»

@Friede Фриде, я не совсем уверен, как на это ответить. Я автор choroplethr и вот как рекомендую решить эту проблему. Эта проблема поднималась много раз на протяжении многих лет. «Как изменить масштаб» — распространенный вопрос, и, по моему мнению, это лучший ответ (понимание того, что choroplethr возвращает объект ggplot2 и что вы можете использовать + для добавления нового масштаба). Принятый ответ игнорирует, что эту проблему можно решить, продолжая использовать хороплетр. Как я написал в конце, похоже, здесь на самом деле было два вопроса.

Ari 06.09.2024 16:29

Я бы рекомендовал в вашем первом предложении указать «что choropleth возвращает объект ggplot2».

Friede 06.09.2024 18:31

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