我正在尝试创建一个折线图,描绘两个组/条件随时间的不同轨迹。我分为两组,分别在五个时间点(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
转换为一个因数,则会出现混乱的情况。同样的事情也发生在我的实际数据中。
我希望它看起来像,用透明的错误信封包裹每行。但是,我不希望它是弯曲的,我希望直线是直线,在每个点上都连接均值。
答案 0 :(得分: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
)
由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))
设置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
值是一个因子,就应该使用均值并以这种方式连接这些点。