Лучший способ сделать это через facet_grid
, который я продемонстрирую ниже. Однако вы можете подумать о том, какой у вас уровень репликации в этом эксперименте. Из данных видно, что у вас есть несколько испытаний для каждого идентификатора, но ваш расчет cummean
группирует все это вместе, что означает, что вы не можете составить график каждого испытания, поскольку вы их агрегировали. В этом упражнении я разбил данные по испытаниям, так как в противном случае это не имело бы особого смысла.
Сначала создайте пример данных. Обратите внимание, что вы должны стараться не использовать df
в качестве имени для фрейма данных, поскольку это уже относится к функции в R.
library(ggplot2)
library(dplyr)
#create some data to use. Note some variable to specify which trial it is
dd <- expand.grid(ID = 1:5,
trial = 1:10,
timespan = c(20,40,60,80,100))
dd$change <- sample(-10:10, size = nrow(dd), replace = T)
dd <- arrange(dd, ID, trial, timespan)
Данные выглядят так:
ID trial timespan change
1 1 1 20 -9
2 1 1 40 -3
3 1 1 60 5
4 1 1 80 -3
5 1 1 100 10
6 1 2 20 7
7 1 2 40 10
8 1 2 60 -6
9 1 2 80 -10
10 1 2 100 -4
Затем создайте столбец last_change
, который обозначает, закончилась ли проба отрицательным или положительным изменением. Мы делаем это, индексируя изменение для каждого испытания ID x, чтобы оно равнялось последнему / наибольшему timespan
для этого испытания. Это означает, что даже если некоторые испытания будут выполняться разное количество времени, этот код все равно будет работать.
dd <- dd %>%
group_by(ID, trial) %>%
mutate(last_change = ifelse(change[timespan == max(timespan)]<0, "neg", "pos")) %>%
ungroup()
Чтобы получить 3 грани на графике, нам нужно будет продублировать все данные и назначить это значение «all» в столбце last_change
.
#repeat all of the data with a last_change value of "all" for the third plot
dd.dup <- mutate(dd, last_change = "all")
dd.all <- bind_rows(dd, dd.dup)
Затем мы можем вставить этот набор данных в код, который вы имели ранее. Обратите внимание, что я добавил trial
и last_change
к вызову group_by
, потому что это единицы репликации. Вам нужно будет подумать, имеет ли это смысл для вашего экспериментального плана.
dd.all %>%
arrange(ID, trial, timespan) %>%
group_by(ID, trial, last_change) %>%
mutate(change = cummean(change)) %>%
ungroup() %>%
ggplot(aes(x = timespan, y = change)) +
geom_line(aes(group = trial)) +
facet_grid(ID~last_change, scales = "free_y")
Это приводит к следующему графику: