Визуализируйте различия между уровнями факторов, используя ggplot
У меня в голове есть сюжет, который я хотел бы создать, но я не знаю, как успешно достичь этой цели.
У меня есть 2 кадра данных, один из которых содержит среднее значение для каждого уровня фактора, а другой - попарные различия между этими уровнями.
contrasts <- data.frame(Level1 = c("setosa", "setosa", "versicolor"),
Level2 = c("versicolor", "virginica", "virginica"),
Diff = c(0.65, 0.46, -0.20),
CI_low = c(0.53, 0.35, -0.32),
CI_high = c(0.75, 0.56, -0.09))
means <- data.frame(Species = c("setosa", "versicolor", "virginica"),
Mean = c(3.42, .77, 2.97))
Моя цель состоит в том, чтобы использовать средства в качестве отправной точки для треугольника, который будет "проецироваться" на уровень соответствующего контраста, высота которого будет равна CI (CI_low
а также CI_high
). Чтобы это выглядело примерно так (простите мою краску):
Используя следующее, я легко добавил начальные точки:
library(tidyverse)
means %>%
ggplot() +
geom_point(aes(x = Species, y= Mean)) +
geom_ribbon(data=contrasts, aes(x=Level1, ymin=CI_low, ymax=CI_high))
Но у меня проблемы с добавлением треугольников. Есть идеи? Большое спасибо!
редактировать
Спасибо Юрию Барвинченко, который предоставил код для получения этого:
contrasts %>%
bind_cols(id=1:3) %>%
inner_join(means, by=c('Level1' = 'Species')) %>%
select(id, x=Level1, y=Mean) %>%
bind_rows( (contrasts %>%
bind_cols(id=1:3) %>%
select(id, x=Level2, y=CI_low)),
(contrasts %>%
bind_cols(id=1:3) %>%
select(id, x=Level2, y=CI_high))) %>%
ggplot(aes(x = x, y= y, group=id)) +
geom_polygon()
Однако, основываясь на средствах, я бы ожидал, что средний уровень (лишний раз) будет "самым низким", тогда как в этом сюжете это virginica, который как самое низкое значение.
1 ответ
Если я правильно понимаю ваш вопрос, вам нужен код, подобный следующему:
contrasts <- tibble(Level1 = c("setosa", "setosa", "versicolor"),
Level2 = c("versicolor", "virginica", "virginica"),
Diff = c(0.65, 0.46, -0.20),
CI_low = c(0.53, 0.35, -0.32),
CI_high = c(0.75, 0.56, -0.09))
means <- tibble(Species = c("setosa", "versicolor", "virginica"),
Mean = c(3.42, .77, 2.97))
library(tidyverse)
contrasts %>%
bind_cols(id=1:3) %>%
inner_join(means, by=c('Level1' = 'Species')) %>%
select(id, x=Level1, y=Mean) %>%
bind_rows( (contrasts %>%
bind_cols(id=1:3) %>%
select(id, x=Level2, y=CI_low)),
(contrasts %>%
bind_cols(id=1:3) %>%
select(id, x=Level2, y=CI_high))) %>%
ggplot(aes(x = x, y= y, group=id)) +
geom_polygon()
Обратите внимание, я использую tibble()
вместо data.frame()
во избежание факторов, для облегчения объединения этих таблиц.