在R中使用ggplot为两个不同的组创建折线图

时间:2018-07-09 20:23:26

标签: r ggplot2 linegraph

我正在尝试创建一个折线图,描绘两个组/条件随时间的不同轨迹。我分为两组,分别在五个时间点(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轴上移动的两条不同颜色的线条)。但是这段代码只是垂直地连接了点:

Here's what it looks like:

如果我不将Time转换为一个因数,而仅将Condition转换为一个因数,则会出现混乱的情况。同样的事情也发生在我的实际数据中。

example graph result

我希望它看起来像like this,用透明的错误信封包裹每行。但是,我不希望它是弯曲的,我希望直线是直线,在每个点上都连接均值。

3 个答案:

答案 0 :(得分:3)

这是通过每次的方式以直线段延伸的直线,范围设置为当时点的标准偏差。一个stat.summary使平均线与colour美学一致,另一个使该区域使用继承的fill美学。 ggplot2::mean_se是一种方便的函数,它采用向量并返回具有均值和+/-一定数量标准误差的数据帧。这是fun.data自变量stat_summary的正确格式,它将这些值传递给指定的geom。在这里,geom_ribbon接受yminymax值以在图形上绘制功能区。

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
    )

reprex package(v0.2.0)于2018-07-09创建。

答案 1 :(得分:1)

这是您想要的最好的猜测:

# 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))

enter image description here

设置level = 0.65约为线性模型拟合的+/- 1标准偏差。

答案 2 :(得分: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值是一个因子,就应该使用均值并以这种方式连接这些点。