Вручную установить цвета группы на основе значений в глобальной среде - PullRequest
0 голосов
/ 13 мая 2019

У меня есть набор данных, и я хочу установить конкретные цвета при использовании ggplot.

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

Пример данных:

library(tidyverse)

df <- tibble(place = c("City", "AAAAA", "ZZZZZ", "City", "AAAAA", "ZZZZZ", "City",
                 "AAAAA", "ZZZZZ"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4, 1),
             y = c(0.475308283, 0.437369818, 0.204992979, 0.263934572,
                 0.671616954, 0.955005667, 0.048954328, 0.900494188,
                 0.418262936))

Это работает:

group_cols <- c("City" = "blue", "ZZZZZ" = "red", "AAAAA" = "green")

place2 <- "AAAAA"

df2 <- df %>% 
  filter(place %in% c("City", place2))

ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols)

enter image description here

Но я хочу сделать это:

group_cols2 <- c("City" = "blue", place2 = "green")

place2 <- "AAAAA"

df2 <- df %>% 
  filter(place %in% c("City", place2))

ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols2)

Используя это - переменная 'place2' не отображается как заполненная.Я использовал 'AAAAA' и 'ZZZZZ', чтобы показать, что я не могу раскрасить по порядку, так как иногда он может быть до 'City', а иногда после него.

enter image description here

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

Это потому, что объект place2, сгенерированный в place2 <- 'AAAAA', является чем-то отличным от уровня df2$place.Обратите внимание, что необходимо другое преобразование.

library(tidyverse)

df <- tibble(place = c("City", "AAAAA", "ZZZZZ", "City", "AAAAA", "ZZZZZ", "City",
                       "AAAAA", "ZZZZZ"),
             x = c(1, 2, 3, 4, 1, 2, 3, 4, 1),
             y = c(0.475308283, 0.437369818, 0.204992979, 0.263934572,
                   0.671616954, 0.955005667, 0.048954328, 0.900494188,
                   0.418262936))
df2 <- df %>% 
  filter(place %in% c("City", place2)) 

levels(df2$place)
> levels(df2$place)
NULL

Итак:

df2 <- df %>% 
  filter(place %in% c("City", place2)) %>% 
  dplyr::mutate(place = as.factor(place))
df2
> df2
# A tibble: 6 x 3
  place     x      y
  <fct> <dbl>  <dbl>
1 City      1 0.475 
2 AAAAA     2 0.437 
3 City      4 0.264 
4 AAAAA     1 0.672 
5 City      3 0.0490
6 AAAAA     4 0.900 
ggplot(df2, aes(x, y, fill = place)) +
  geom_col()

enter image description here

group_cols2 <- c("City" = "blue", place2 = "green")
place2 <- "AAAAA"
ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols2)

enter image description here

Чтобы решить эту проблему, есть два простейших способа:

  1. Изменить цветовую шкалу, как вы уже сделали.
group_cols2 <- c("City" = "blue", "AAAAA" = "green")
ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols2)

enter image description here

Изменение информации во фрейме данных.
group_cols2 <- c("City" = "blue", place2 = "green")
df2 <- df %>% 
  filter(place %in% c("City", place2)) %>% 
  dplyr::mutate(place = as.factor(place), 
                place = dplyr::case_when(place == "AAAAA" ~ "place2",
                                         place == "City" ~ "City"),
                place = forcats::fct_relevel(place, "place2"))

ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols2)

enter image description here

1 голос
/ 13 мая 2019

это работает

place2 <- "AAAAA"
group_cols2 <- c("City" = "blue", setNames("green",place2))



df2 <- df %>% 
  filter(place %in% c("City", place2))

ggplot(df2, aes(x, y, fill = place)) +
  geom_col() + scale_fill_manual(values=group_cols2)
...