В ggplot2, когда есть facet_wrap, как сделать все столбцы geom_col одного цвета, если они имеют одинаковое значение?

У меня есть датафрейм df с тремя столбцами: TASK, CONDITION, а также SCORE, Я хочу представить данные:

  1. как барплоты (я использую geom_col)
  2. с отдельным участком для каждого TASK (Я используюfacet_wrap(~TASK))
  3. с отдельным баром для каждого CONDITION (Я использую ggplot(df, aes(x=CONDITION)))

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

В приведенном ниже минимальном примере 3 бара достигают 100%, поэтому я ожидаю, что все они будут синими в соответствии с инструкцией high="blue" но это не то, что происходит.

Input =("
TASK CONDITION SCORE
GAU   0         0.25
GAU   0         0.25
GAU   0         0.25
GAU   0         0.25
GAU   1         0.2
GAU   1         0.2
GAU   1         0.2
GAU   1         0.2
GAU   1         0.2
PLN   0         0.3333
PLN   0         0.3333
PLN   0         0
PLN   1         0.5
PLN   1         0.5
        ")
df <- read.table(textConnection(Input),
                 header=TRUE)
df$CONDITION <- factor(df$CONDITION)

library(ggplot2)
ggplot(df, aes(x=CONDITION, y=SCORE, fill=SCORE)) +
  geom_col() +
  ggtitle("Performance") +
  ylab("Total") +
  scale_y_continuous(labels = scales::percent) +
  facet_wrap(~TASK) +
  scale_fill_gradient(low="red", high="blue")

1 ответ

Решение

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

df2 <- df
df2[1, "SCORE"] <- .5
ggplot(df2, aes(x=CONDITION, y=SCORE, fill=SCORE)) +
  geom_col(color="black") +
  ggtitle("Performance") +
  ylab("Total") +
  scale_y_continuous(labels = scales::percent) +
  facet_wrap(~TASK) +
  scale_fill_gradient(low="red", high="blue")

Это не раскраска по общей высоте сюжета, это раскраска по каждому наблюдению. Обратите внимание, что ваша цветовая гамма только увеличивалась до 0,5. Если вы просто хотите использовать ggplot для этого, вы можете использовать итоговую статистику для geom_bar, чтобы выполнить суммирование для вас. Это будет выглядеть так

ggplot(df, aes(x=CONDITION, y=SCORE, fill=..y..)) +
  geom_bar(stat="summary", fun.y="sum") +
  ggtitle("Performance") +
  ylab("Total") +
  scale_y_continuous(labels = scales::percent) +
  facet_wrap(~TASK) +
  scale_fill_gradient(low="red", high="blue")

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