#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:
Это может быть достигнуто следующим образом:
- Добавьте новые переменные с цветами в свой набор данных в соответствии с вашими условиями, используя, например
dplyr::mutate
, иdplyr::case_when
- Сопоставьте эти новые переменные с
color
илиfill
. - Используйте
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(...