Использование 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 значение является фактором, оно должно использовать среднее значение и соединять точки таким образом.

Другие вопросы по тегам