如果你有复制的数据,并且想绘制均值/置信区间,最好使用 stat_summary(...)
这个函数,该函数专门用于汇总数据。基本上,它会对每个 x 值的所有 y 值应用一个函数(如平均数函数mean(...)
),然后使用指定的几何图形绘制结果。以下是一个示例:
set.seed(1)
time <- 1:25
df <- data.frame(time,
pop=rnorm(100*length(time), mean=10*time/(25+time)))
library(ggplot2)
ggplot(df, aes(x=time, y=pop))+
stat_summary(geom="ribbon", fun.data=mean_cl_normal, width=0.1, conf.int=0.95, fill="lightblue")+
stat_summary(geom="line", fun.y=mean, linetype="dashed")+
stat_summary(geom="point", fun.y=mean, color="red")
![](https://istack.dev59.com/VzaDp.webp)
这里有三个图层:一个使用
mean(...)
函数汇总y值并使用
geom="line"
绘制的图层,一个以相同方式汇总但使用
geom="point"
绘制的图层,以及一个使用
geom="ribbon"
的图层。该geom需要
ymin
和
ymax
美学属性,因此我们使用内置的ggplot函数
mean_cl_normal
生成这些属性,基于误差服从正态分布且均值遵循t分布的假设。输入
?hmisc
以获取有关各种用于置信区间的实用函数的文档。图层按代码顺序呈现,因此,由于您想要阴影,我们需要首先放置误差带。
最后,当然可以使用dplyr
或类似工具自己汇总数据,但我真的不认为这样做有什么意义。
更新(基于最近的评论):
看起来最新版本的ggplot2
(2.0.0)有一种不同的方法来指定fun.data
的参数。在新版本中,应该这样写:
ggplot(df, aes(x=time, y=pop))+
stat_summary(geom="ribbon", fun.data=mean_cl_normal,
fun.args=list(conf.int=0.95), fill="lightblue")+
stat_summary(geom="line", fun.y=mean, linetype="dashed")+
stat_summary(geom="point", fun.y=mean, color="red")
使用
width=...
参数的问题有点微妙,我认为它实际上是不必要的(在原始答案中,我使用了误差条,并忘记在将其更改为带状图时删除此参数)。较旧版本的ggplot2会忽略多余的参数(因此没有错误)。显然,新版本更加严格。可能这样更好。
?stat_smooth
。 - Jaap