使用R.zoo绘制带有误差条的多个系列

使用R.zoo绘制带有误差条的多个系列,r,plot,time-series,zoo,R,Plot,Time Series,Zoo,我有如下数据: > head(data) groupname ob_time dist.mean dist.sd dur.mean dur.sd ct.mean ct.sd 1 rowA 0.3 61.67500 39.76515 43.67500 26.35027 8.666667 11.29226 2 rowA 60.0 45.49167 38.30301 37.58333

我有如下数据:

   > head(data)
             groupname ob_time dist.mean  dist.sd dur.mean   dur.sd   ct.mean    ct.sd
      1      rowA     0.3  61.67500 39.76515 43.67500 26.35027  8.666667 11.29226
      2      rowA    60.0  45.49167 38.30301 37.58333 27.98207  8.750000 12.46176
      3      rowA   120.0  50.22500 35.89708 40.40000 24.93399  8.000000 10.23363
      4      rowA   180.0  54.05000 41.43919 37.98333 28.03562  8.750000 11.97061
      5      rowA   240.0  51.97500 41.75498 35.60000 25.68243 28.583333 46.14692
      6      rowA   300.0  45.50833 43.10160 32.20833 27.37990 12.833333 14.21800
每个组名都是一个数据系列。因为我想分别绘制每个系列,所以我将它们分开如下:

> A <- zoo(data[which(groupname=='rowA'),3:8],data[which(groupname=='rowA'),2])
> B <- zoo(data[which(groupname=='rowB'),3:8],data[which(groupname=='rowB'),2])
> C <- zoo(data[which(groupname=='rowC'),3:8],data[which(groupname=='rowC'),2])
> head(z$rowA)
          dist.mean  dist.sd dur.mean   dur.sd   ct.mean    ct.sd
     0.3  61.67500 39.76515 43.67500 26.35027  8.666667 11.29226
     60   45.49167 38.30301 37.58333 27.98207  8.750000 12.46176
     120  50.22500 35.89708 40.40000 24.93399  8.000000 10.23363
     180  54.05000 41.43919 37.98333 28.03562  8.750000 11.97061
     240  51.97500 41.75498 35.60000 25.68243 28.583333 46.14692
     300  45.50833 43.10160 32.20833 27.37990 12.833333 14.21800
因此,如果我想绘制距离平均值与时间的关系图,并为每个系列包括等于+/-dist.sd的误差条:

  • 如何将A、B、C dist.mean和dist.sd结合起来
  • 我如何制作一个条形图,或者更好,一个结果对象的线图

    • 这是我尝试做这件事的方式的暗示。我忽略了分组,所以您必须修改它以包含多个系列。我也没用过动物园,因为我知道的不多

      g <- (nrow(data)-1)/(3*nrow(data))
      
      plot(data[,"dist.mean"],col=2, type='o',lwd=2,cex=1.5, main="This is the title of the graph",
       xlab="x-Label", ylab="y-Label", xaxt="n",
       ylim=c(0,max(data[,"dist.mean"])+max(data[,"dist.sd"])),
       xlim=c(1-g,nrow(data)+g))
      axis(side=1,at=c(1:nrow(data)),labels=data[,"ob_time"])
      
      for (i in 1:nrow(data)) {
      lines(c(i,i),c(data[i,"dist.mean"]+data[i,"dist.sd"],data[i,"dist.mean"]-data[i,"dist.sd"]))
      lines(c(i-g,i+g),c(data[i,"dist.mean"]+data[i,"dist.sd"], data[i,"dist.mean"]+data[i,"dist.sd"]))
      lines(c(i-g,i+g),c(data[i,"dist.mean"]-data[i,"dist.sd"], data[i,"dist.mean"]-data[i,"dist.sd"]))
      }
      

      g我看不出把数据分成三部分的意义,只需要将它们组合在一起就可以绘制一个图。以下是使用
      ggplot2
      库的绘图:

      library(ggplot2)
      qplot(ob_time, dist.mean, data=data, colour=groupname, geom=c("line","point")) + 
        geom_errorbar(aes(ymin=dist.mean-dist.sd, ymax=dist.mean+dist.sd))
      
      这将沿自然比例分隔时间值,您可以使用
      scale\u x\u continuous
      定义实际时间值处的记号。让它们等距分布更为棘手:您可以将
      ob_time
      转换为一个因子,但
      qplot
      拒绝用线连接点

      解决方案1-条形图:

      qplot(factor(ob_time), dist.mean, data=data, geom=c("bar"), fill=groupname, 
            colour=groupname, position="dodge") + 
      geom_errorbar(aes(ymin=dist.mean-dist.sd, ymax=dist.mean+dist.sd), position="dodge")
      
      解决方案2-使用1,2,。。。系数的重新编码:

      qplot(factor(ob_time), dist.mean, data=data, geom=c("line","point"), colour=groupname) +
        geom_errorbar(aes(ymin=dist.mean-dist.sd, ymax=dist.mean+dist.sd)) + 
        geom_line(aes(x=as.numeric(factor(ob_time))))
      

      使用Read.zoo读取中的数据,并使用split=参数按groupname进行拆分。然后将dist、lower和upper行绑定在一起。最后,我要把它们画出来

      Lines <- "groupname ob_time dist.mean  dist.sd dur.mean   dur.sd   ct.mean    ct.sd
      rowA     0.3  61.67500 39.76515 43.67500 26.35027  8.666667 11.29226
      rowA    60.0  45.49167 38.30301 37.58333 27.98207  8.750000 12.46176
      rowA   120.0  50.22500 35.89708 40.40000 24.93399  8.000000 10.23363
      rowA   180.0  54.05000 41.43919 37.98333 28.03562  8.750000 11.97061
      rowB   240.0  51.97500 41.75498 35.60000 25.68243 28.583333 46.14692
      rowB   300.0  45.50833 43.10160 32.20833 27.37990 12.833333 14.21800"
      
      library(zoo)
      # next line is only needed until next version of zoo is released
      source("http://r-forge.r-project.org/scm/viewvc.php/*checkout*/pkg/zoo/R/read.zoo.R?revision=719&root=zoo")
      z <- read.zoo(textConnection(Lines), header = TRUE, split = 1, index = 2)
      
      # pick out the dist and sd columns binding dist with lower & upper 
      z.dist <- z[, grep("dist.mean", colnames(z))]
      z.sd <- z[, grep("dist.sd", colnames(z))]
      zz <- cbind(z = z.dist, lower = z.dist - z.sd, upper = z.dist + z.sd)
      
      # plot using N panels
      N <- ncol(z.dist)
      ylab <- sub("dist.mean.", "", colnames(z.dist))
      plot(zz, screen = 1:N, type = "l", lty = rep(1:2, N*1:2), ylab = ylab)
      

      Lines我认为您不需要为这种类型的绘图创建zoo对象,我会直接从数据框中创建。当然,使用zoo对象可能还有其他原因,例如智能合并、聚合等

      一个选项是latticeExtra的
      segplot
      函数

      library(latticeExtra)
      segplot(ob_time ~ (dist.mean + dist.sd) + (dist.mean - dist.sd) | groupname, 
          data = data, centers = dist.mean, horizontal = FALSE)
      ## and with the latest version of latticeExtra (from R-forge):
      trellis.last.object(segments.fun = panel.arrows, ends = "both", angle = 90, length = .1) +
          xyplot(dist.mean ~ ob_time | groupname, data, col = "black", type = "l")
      
      使用Gabor的可复制数据集,这将产生:


      你是出于某种原因坚持要
      zoo
      ,还是你只想使用任何可用的工具来绘制情节?@Aniko:我没有特别执着于任何东西。我现在使用的是
      zoo
      ,因为这正是我阅读的方向。关于你的第一个问题,这有帮助吗?图书馆(plyr);zoo.obj@gd047:那太棒了!但是把它放在一个答案里,这样我就可以给你打分了。你想要的情节看起来像这些吗,
      library(latticeExtra)
      segplot(ob_time ~ (dist.mean + dist.sd) + (dist.mean - dist.sd) | groupname, 
          data = data, centers = dist.mean, horizontal = FALSE)
      ## and with the latest version of latticeExtra (from R-forge):
      trellis.last.object(segments.fun = panel.arrows, ends = "both", angle = 90, length = .1) +
          xyplot(dist.mean ~ ob_time | groupname, data, col = "black", type = "l")