使用ggplot绘制均值和置信区间

13

我有一些从模型中收集到的数据,想要绘制人口数量随时间变化的图表。我已经获得了每个时间步长的人口数量和100个重复实验。我希望能够绘制每个时间步长的平均人口数量,并且还要显示95%置信区间(如果可能的话可以用阴影表示)。

到目前为止,我还没有使用过ggplot。我一直在使用R中的普通(基本)绘图。但我想看看ggplot的效果。

以下是我的进展:

ggplot(data=model1, aes(x=steps., y= pop-size, col='blue')) + 
   geom_line()

这会绘制所有的点,看起来很好,但我不知道如何只绘制均值并添加置信区间。


1
你应该在这里检查:http://www.cookbook-r.com/Graphs/Plotting_means_and_error_bars_(ggplot2)/ - AntoniosK
1
也可以看一下 ?stat_smooth - Jaap
由于您相对较新于SO,请阅读此页面和此页面,了解如何提出精心制作的问题,从而更有可能得到回答。 - jlhoward
1个回答

28

如果你有复制的数据,并且想绘制均值/置信区间,最好使用 stat_summary(...) 这个函数,该函数专门用于汇总数据。基本上,它会对每个 x 值的所有 y 值应用一个函数(如平均数函数mean(...)),然后使用指定的几何图形绘制结果。以下是一个示例:

# sample data - should be provided in question
set.seed(1)      # for reproducible example
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")

这里有三个图层:一个使用mean(...)函数汇总y值并使用geom="line"绘制的图层,一个以相同方式汇总但使用geom="point"绘制的图层,以及一个使用geom="ribbon"的图层。该geom需要yminymax美学属性,因此我们使用内置的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会忽略多余的参数(因此没有错误)。显然,新版本更加严格。可能这样更好。

1
我稍微更喜欢 stat_summary(geom="ribbon", fun.data=mean_cl_normal, colour=NA,alpha=0.1) - Ben Bolker
我实际上更喜欢误差条,但事实上我误读了问题 - OP想要带状图。我编辑了我的回答。 - jlhoward
谢谢!这太完美了。下次我会确保在我的问题中放入样本数据等内容。 - 91dpo
1
这很棒,但是新的ggplot2是否破坏了它?当我使用ggplot2_2.2.0和Hmisc_3.17-1运行上述代码时,我会得到以下错误:Error: Unknown parameters: width, conf.int - Andy Stein
谢谢,太棒了! - Andy Stein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接