У меня есть график, работающий в «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»)», но ничего из того, что я пробовал до сих пор, не помогло.
Вы упоминаете, что пытались изменить цвета разными способами. Было бы полезно, если бы вы включили код, который вы пробовали, но он не работал. Из-за этого мне трудно понять, связана ли ваша проблема с RColorBrewer или с тем, как применить собственную шкалу к хороплетру. В своем ответе я показываю, как использовать шкалу из принятого ответа, при этом используя хороплетр для создания карты.
Хотя 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».
Ключ в том, чтобы понять, что 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 и что вы можете использовать + для добавления нового масштаба). Принятый ответ игнорирует, что эту проблему можно решить, продолжая использовать хороплетр. Как я написал в конце, похоже, здесь на самом деле было два вопроса.
Я бы рекомендовал в вашем первом предложении указать «что choropleth возвращает объект ggplot2».
Постройте отрицательные данные, которые должны работать.