условные цвета geom_bar и geom_point

#r #ggplot2 #dplyr #geom-bar #geom-point

#r #ggplot2 #dplyr #геометрическая панель #геометрическая точка

Вопрос:

У меня есть простые geom_bar и geom_point, и я хотел бы раскрасить полосы и точки на основе значений в данных. В настоящее время мой код выглядит следующим образом:

 ```df <- (Test3)

ggplot(Test3,aes(ques,diff1,subj)) 
  geom_bar(stat = "identity") 
  geom_point(aes(x=ques, y= diff2)) 
  facet_grid(~subj)
  

Моя диаграмма в настоящее время выглядит так: диаграмма

Мои данные выглядят так:

 ```# A tibble: 8 x 9
  subj   ques    `%` `sect%`  diff1    ci last_y  diff2    tt
  <chr>  <chr> <dbl>   <dbl>  <dbl> <dbl>  <dbl>  <dbl> <dbl>
1 geog   q1     82.1    83.6  -1.49  10.1     78   4.14  2.1 
2 geog   q2     80      50    30     10.1     54  26    -1.28
3 hist   q1     92.9    83.6   9.21  10.1     NA  NA    NA   
4 hist   q2     85.7    82.8   2.94  10.1     NA  NA    NA   
5 Sports q1     73.8    82.4  -8.61  10.1     95 -21.2   2.97
6 Sports q2     69.2    81.8 -12.6   10.1     12  57.2  -2.59
7 sci    q1     78.6    85.2  -6.66  10.1     87  -8.43 -3   
8 sci    q2     78      50    28     10.1     55  23     2 
  

Я бы хотел, чтобы столбцы были зелеными, если diff1>= ci, красными, если diff1 <= ci, и серыми, если ни того, ни другого.
И чтобы точки были зелеными, если tt> = 1,96, или красными, если tt < = 1,96, и серыми, если ни то, ни другое. Был бы признателен за помощь.

Ответ №1:

Это может быть достигнуто следующим образом:

  1. Добавьте новые переменные с цветами в свой набор данных в соответствии с вашими условиями, используя, например dplyr::mutate , и dplyr::case_when
  2. Сопоставьте эти новые переменные с color или fill .
  3. Используйте scale_color/fill_identity
 library(ggplot2)
library(dplyr)

Test3 <- Test3 %>%
  mutate(
    fill = case_when(
      diff1 >= ci ~ "green",
      diff1 < ci ~ "red",
      TRUE ~ "grey"
    ),
    color = case_when(
      tt >= 1.96 ~ "green",
      tt < 1.96 ~ "red",
      TRUE ~ "grey"
    )
  )

ggplot(Test3, aes(ques, diff1, subj))  
  geom_col(aes(fill = fill))  
  geom_point(aes(x = ques, y = diff2, color = color))  
  scale_color_identity()  
  scale_fill_identity()  
  facet_grid(~subj)
#> Warning: Removed 2 rows containing missing values (geom_point).
  

ДАННЫЕ

 Test3 <- structure(list(subj = c(
  "geog", "geog", "hist", "hist", "Sports",
  "Sports", "sci", "sci"
), ques = c(
  "q1", "q2", "q1", "q2", "q1",
  "q2", "q1", "q2"
), `%` = c(
  82.1, 80, 92.9, 85.7, 73.8, 69.2,
  78.6, 78
), `sect%` = c(
  83.6, 50, 83.6, 82.8, 82.4, 81.8, 85.2,
  50
), diff1 = c(-1.49, 30, 9.21, 2.94, -8.61, -12.6, -6.66, 28), ci = c(10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1), last_y = c(
  78L,
  54L, NA, NA, 95L, 12L, 87L, 55L
), diff2 = c(
  4.14, 26, NA, NA,
  -21.2, 57.2, -8.43, 23
), tt = c(
  2.1, -1.28, NA, NA, 2.97, -2.59,
  -3, 2
)), class = "data.frame", row.names = c(
  "1", "2", "3", "4",
  "5", "6", "7", "8"
))
  

Комментарии:

1. Это полезно, спасибо. Я почти на месте. Я изо всех сил пытаюсь добавить фильтры в Test3 df. Если возможно, не могли бы вы сообщить мне, как объединить аргумент фильтра с mutate? что-то вроде filter(Test3, subj == "geog" | subj == "hist") . Когда я добавляю это, кажется, что это отменяет аргументы цвета

2. Вы можете добавить фильтр следующим образом. Test3 <- Test3 %>% filter(subj == "geog" | subj == "hist") %>% mutate(...