2

我有这样的数据

subject<-1:208
ev<-runif(208, min=1, max=2)  
seeds<-gl(6,40,labels=c('seed1', 'seed2','seed3','seed4','seed5','seed6'),length=208)  
ngambles<-gl(2,1, labels=c('4','32'))    
trial<-rep(1:20, each= 2, length=208)  
ngambles<-rep('4','32' ,each=1, length=208)  
data<-data.frame(subject,ev,seeds,ngambles,trial)  

数据看起来像这样

subject       ev   seeds ngambles trial
      1 1.996717 seed1        4     1
      2 1.280977 seed1       32     1
      3 1.571648 seed1        4     2
      4 1.153311 seed1       32     2
      5 1.502559 seed1        4     3
      6 1.644001 seed1       32     3

我通过这个命令为每个种子和 n_gambles 绘制了一个图表,其中 rep 作为 x 轴,expected_value 作为 y 轴。

qplot(trial,ev,data=data,
      facets=ngambles~seeds,xlab="Trial", ylab="Expected Value", geom="line")+
     opts(title = "Expected Value for Each Seed")

现在我想通过聚合 ev 来绘制一个新图,用于试验等于 1-5、6-10、11-15 和 16-20。我也想画一个误差线。

我不知道如何在 R 中做也许有人可以帮助我提前谢谢

4

1 回答 1

2

假设您的数据框被称为df. 首先,添加了新列 ag,显示原始试验值将属于哪个区间 function cut()

df$ag<-cut(df$trial,c(1,6,11,16,21),right=FALSE)

现在有两种可能性 - 首先,使用 ggplot2 的 stat_.. 函数聚合您的数据。已经stat_summary()定义了函数,然后您还应该定义stat_sum_df()函数(取自 stat_summary() 帮助文件)来计算多个汇总值。

stat_sum_df <- function(fun, geom="crossbar", ...) {
     stat_summary(fun.data=fun, colour="red", geom=geom, width=0.2, ...)
 }

使用stat_sum_df()和 参数"mean_cl_normal"计算置信区间以用于geom="errorbar"和 的stat_summary()平均值geom="line"。作为 x 值使用新列agscale_x_discrete()您可以获得正确的 x 轴标签。

ggplot(df, aes(ag,ev,group=seeds))+stat_sum_df("mean_cl_normal",geom="errorbar")+
  stat_summary(fun.y="mean",geom="line",color="red")+
  facet_grid(ngambles~seeds)+
  scale_x_discrete(labels=c("1-5","6-10","11-15","16-20"))

在此处输入图像描述

第二种方法是在绘图之前汇总数据,例如,使用ddply()library中的函数plyr。同样在这种情况下,您需要ag在第一个示例中制作的列。然后使用新数据进行绘图。

library(plyr)
df.new<-ddply(df,.(ag,seeds,ngambles),summarise,ev.m=mean(ev),
      ev.lim=qt(0.975,length(ev)-1)*sd(ev)/sqrt(length(ev)))

ggplot(df.new,aes(ag,group=seeds))+
  geom_errorbar(aes(y=ev.m,ymin=ev.m-ev.lim,ymax=ev.m+ev.lim))+
  geom_line(aes(y=ev.m))+
  facet_grid(ngambles~seeds)+
  scale_x_discrete(labels=c("1-5","6-10","11-15","16-20"))
于 2013-07-21T06:33:10.223 回答