Использование ggplot в R для создания линейного графика для двух разных групп
Я пытаюсь создать линейный график, изображающий различные траектории во времени для двух групп / условий. У меня есть две группы, для которых данные "есть" собирались в пять временных точек (1,2,3,4,5). Мне бы хотелось, чтобы линии соединяли среднюю точку для каждой группы в каждой из пяти временных точек, поэтому у меня было бы две точки во время 1, две точки во время 2 и так далее.
Вот воспроизводимый пример:
#Example data
library(tidyverse)
library(ggplot2)
eat <- sample(1:7, size = 30, replace = TRUE)
df <- data.frame(id = rep(c(1, 2, 3, 4, 5, 6), each = 5),
Condition = rep(c(0, 1), each = 15),
time = c(1, 2, 3, 4, 5),
eat = eat
)
df$time <- as.factor(df$time)
df$Condition <- as.factor(df$Condition)
#Create the plot.
library(ggplot2)
ggplot(df, aes(x = time, y = eat, fill = Condition)) + geom_line() +
geom_point(size = 4, shape = 21) +
stat_summary(fun.y = mean, colour = "red", geom = "line")
Проблема в том, что мне нужно, чтобы мои линии шли горизонтально (то есть чтобы показать две разноцветные линии, движущиеся по оси X). Но этот код просто соединяет точки по вертикали:
Если я не буду конвертировать Time
в фактор, но только конвертировать Condition
фактор, я получаю беспорядок линий. То же самое происходит и с моими фактическими данными.
Я бы хотел, чтобы это выглядело так эстетически, с прозрачными ошибочными конвертами, обертывающими каждую строку. Однако я не хочу, чтобы он был пышным, я хочу, чтобы линии были прямыми, соединяя средства в каждой точке.
3 ответа
Вот линии, проходящие прямыми отрезками по среднему значению каждого времени, с диапазоном, установленным как стандартное отклонение точек в данный момент. Один stat.summary
делает среднюю линию с colour
эстетический, другой делает область, используя унаследованные fill
эстетичным. ggplot2::mean_se
это удобная функция, которая берет вектор и возвращает фрейм данных со средним значением и +/- некоторым количеством стандартных ошибок. Это правильный формат дляfun.data
аргумент stat_summary
, который передает эти значения в geom
указано. Вот, geom_ribbon
принимает ymin
а также ymax
значения для построения ленты на графике.
library(tidyverse)
set.seed(12345)
eat <- sample(1:7, size = 30, replace = T)
df <- data.frame(
Condition = rep(c(0, 1), each = 15),
time = c(1, 2, 3, 4, 5),
eat = eat
)
df$Condition <- as.factor(df$Condition)
ggplot(df, aes(x = time, y = eat, fill = Condition)) +
geom_point(size = 4, shape = 21, colour = "black") +
stat_summary(geom = "ribbon", fun.data = mean_se, alpha = 0.2) +
stat_summary(
mapping = aes(colour = Condition),
geom = "line",
fun.y = mean,
show.legend = FALSE
)
Создано 2018-07-09 пакетом представлением (v0.2.0).
Вот мое лучшее предположение о том, что вы хотите:
# keep time as numeric
df$time = as.numeric(as.character(df$time))
ggplot(df, aes(x = time, y = eat, group = Condition)) +
geom_smooth(
aes(fill = Condition, linetype = Condition),
method = "lm",
level = 0.65,
color = "black",
size = 0.3
) +
geom_point(aes(color = Condition))
Настройка level = 0.65
составляет примерно +/- 1 стандартное отклонение при линейной модели.
Я думаю, что этот код даст вам большую часть пути там
library(tidyverse)
eat <- sample(1:7, size = 30, replace = TRUE)
tibble(id = rep(c(1, 2, 3, 4, 5, 6), each = 5),
Condition = factor(rep(c(0, 1), each = 15)),
time = factor(rep(c(1, 2, 3, 4, 5), 6)),
eat = eat) %>%
ggplot(aes(x = time, y = eat, fill = Condition, group = Condition)) +
geom_point(size = 4, shape = 21) +
geom_smooth()
geom_smooth
это то, что вы искали, я думаю. Это создает линейную модель из точек, и до тех пор, пока ваш x
значение является фактором, оно должно использовать среднее значение и соединять точки таким образом.