Как я могу изменить цвета моих баров в соответствии с условием на ggplot в R? - PullRequest
1 голос
/ 06 марта 2020
df <-data.frame(BA_5287)

question <- df$Type.of.Question 
submission <- df$Students.submitted
score <- df$Score.Correctly

cond <- ifelse(abs(score)>94,'darkgreen',
               ifelse(abs(score)<0.94 & abs(score) >=0.7,'yellow','red'))

graph <- ggplot(data=df,
                aes(x=Question,y=Score))+geom_bar(stat = "identity",
                                                  color='blue',
                                                  fill=cond)
graph + coord_flip()

Это мой код. Цвета баров меняются, но не в соответствии с условиями. Может кто-нибудь помочь мне, пожалуйста? Спасибо!

1 Ответ

0 голосов
/ 07 марта 2020

Основная проблема заключается в том, что вы должны использовать другой aes() в строке geom_bar и вызвать в этом аргумент fill. Затем, как упоминалось выше @ dc37, вам просто нужно использовать scale_fill_identity.

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

Вот пример с некоторыми составленными данными

library(dplyr)
library(ggplot2)

df <- data.frame(question  = LETTERS[1:15],
                 score = rnorm(15, 90,5))

Вместо вложенного оператора ifelse, использование case_when гораздо более читабельно для человека .

  df <- df %>%
  mutate(cond = case_when(
    score > 94 ~ 'darkgreen',
    score < 0.7 ~ 'red',
    TRUE ~ 'yellow'   #anything that does not meet the criteria above
  ))

Затем вы можете использовать заливку в aes() вызове geom_bar и добавить scale_fill_identity

ggplot(data = df, aes(x = question, y =score)) +
  geom_bar(stat = "identity", color = 'blue', aes(fill = cond)) +
  scale_fill_identity() +
  coord_flip()

enter image description here

...