Цвет / заполнить столбцы в geom_col на основе другой переменной? - PullRequest
1 голос
/ 12 апреля 2020

У меня есть неокрашенный geom_col, и я хотел бы, чтобы он отображал информацию о другой (непрерывной) переменной, отображая различные оттенки цвета в столбцах.

Пример

Начиная с geom_col

library(dplyr)
library(ggplot2)

set.seed(124)
iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n()) %>% 
  ggplot(aes(Species, n)) + 
  geom_col()

Предположим, мы хотим раскрасить столбцы в соответствии с тем, как низко / высоко mean(Sepal.Width) в каждой группе

(примечание: я не знаю, есть ли способ предоставить «непрерывные» цвета для ggplot, но если нет, то лучше использовать следующие цвета)

library(RColorBrewer)
display.brewer.pal(n = 3, name= "PuBu")
brewer.pal(n = 3, name = "PuBu")
[1] "#ECE7F2" "#A6BDDB" "#2B8CBE"

Конечный результат должен быть таким же, как и выше, geom_col, но с цветными полосами в зависимости от того, насколько низко / высоко mean(Sepal.Width).

Примечания

  • Этот ответ показывает нечто похожее, но очень ручное, и хорошо для 3 тактов, но не является устойчивым для многих графиков с большим количеством столбцов (поскольку потребуется вручную установить слишком много case_when условий)
  • Этот аналогичен, но раскраска основана на переменной уже отображается в сюжете, а не n другая переменная
  • Обратите внимание, что в приведенном выше примере есть 3 столбца, и я предоставляю 3 цвета, это несколько вручную, и если есть лучший (то есть менее ручной) способ обозначения цветов, я был бы рад чтобы узнать это

Что я пробовал

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

library(RColorBrewer)

# fill info from: https://stackoverflow.com/questions/38788357/change-bar-plot-colour-in-geom-bar-with-ggplot2-in-r
set.seed(124)
iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n(), sep_mean = mean(Sepal.Width)) %>% 
  arrange(desc(n)) %>% 
  mutate(colors = brewer.pal(n = 3, name = "PuBu")) %>% 
  mutate(Species=factor(Species, levels=Species)) %>% 
  ggplot(aes(Species, n, fill = colors)) + 
  geom_col()

1 Ответ

1 голос
/ 12 апреля 2020

Выполните следующие действия:

  • добавьте fill = sep_mean к aes()
  • добавьте + scale_fill_gradient()
  • удалите mutate(colors = brewer.pal(n = 3, name = "PuBu")), так как предыдущий шаг заботится о цвета для вас
set.seed(124)

iris[sample(1:150, 50), ] %>% 
  group_by(Species) %>% 
  summarise(n=n(), sep_mean = mean(Sepal.Width)) %>%
  arrange(desc(n)) %>% 
  mutate(Species=factor(Species, levels=Species)) %>% 
  ggplot(aes(Species, n, fill = sep_mean, label=sprintf("%.2f", sep_mean))) + 
  geom_col() +
  scale_fill_gradient() +
  labs(fill="Sepal Width\n(mean cm)") +
  geom_text()

enter image description here

...