R 向包含多个组的条形图添加错误条

R 向包含多个组的条形图添加错误条,r,lattice,bar-chart,R,Lattice,Bar Chart,我有以下要添加错误条的条形图 library(lattice) barchart(Change~fTreat,groups=Process,change, auto.key=list(points=FALSE,rectangles=TRUE), panel=function(x, y,...){ panel.barchart(x,y,origin = 0,...); panel.abline(h=0,

我有以下要添加错误条的条形图

library(lattice)    
barchart(Change~fTreat,groups=Process,change,
          auto.key=list(points=FALSE,rectangles=TRUE),
          panel=function(x, y,...){
            panel.barchart(x,y,origin = 0,...);
            panel.abline(h=0,col="black",...);
            }
          )

我曾尝试使用memisc包中的panel.errbar,它对xyplots非常有用,但当我将其添加到代码中时,它并不尊重组

library(memisc)    
barchart(cbind(Change,lower,upper)~fTreat,groups=Process,change,
     ylab="Pocertage change",
     ylim=-115:50,
     scales=list(alternating=FALSE,
                 tick.number=7,
                 tck=c(-1,0)),
     panel=function(x, y,groups,...){
       panel.barchart(x,y=change$Change,groups=change$Process,origin = 0,...);
       panel.abline(h=0,col="black",...);
       panel.errbars(x,y,make.grid="none",ewidth=0.2,type="n",...)
     }
     )
关于如何使用panel.errbar或任何其他函数将错误条添加到绘图中,您有什么想法吗

数据:

    structure(list(Treat = structure(c(3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L), .Label = c("12-380", "12-750", "8-380", "8-750"), class = "factor"), 
    Process = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Resp", 
    "Cal"), class = c("ordered", "factor")), Change = c(-33.05, 
    -34.74, 20.94, 18.06, 6.85, -28.57, -8.1, -78.72), upper = c(-13.22896628, 
    -28.61149669, 31.29930461, 27.30173776, 39.73271282, 9.458372948, 
    13.11035572, -47.03745704), lower = c(-52.86120694, -40.87446411, 
    10.57421563, 8.822042178, -26.03144161, -66.60447035, -29.30563327, 
    -110.3973761), fTreat = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 
    3L, 4L), .Label = c("8-380", "8-750", "12-380", "12-750"), class = c("ordered", 
    "factor"))), .Names = c("Treat", "Process", "Change", "upper", 
"lower", "fTreat"), row.names = c(NA, -8L), class = "data.frame")

干杯

这不是您想要的,但是使用
ggplot2
(在这种情况下,这是一个选项)绘图相当容易


dt这是我用晶格给出的另一个答案

prepanel=function(y, stderr, subscripts=subscripts, ...){
  uy <- as.numeric(y+stderr[subscripts])
  ly <- as.numeric(y-stderr[subscripts])
  list(ylim=range(y,uy,ly, finite=TRUE))
}
panel.err=function(x, y, subscripts, groups, stderr, box.ratio, ...){
  d <- 1/(nlevels(groups)+nlevels(groups)/box.ratio)
  g <- (as.numeric(groups[subscripts])-1); g <- (g-median(g))*d
  panel.arrows(as.numeric(x)+g,y-stderr[subscripts], as.numeric(x)+g, y+stderr[subscripts],
               code=3,angle=90, length=0.025)
}
barchart(Change~fTreat,groups=Process,change,
         stderr=change$stderr,
         ylab="Pocertage change",
         xlab="Treatment",
         ylim=-115:50,
         auto.key=list(points=FALSE,rectangles=TRUE,columns=2),
         scales=list(alternating=FALSE,
                     tick.number=7,
                     tck=c(-1,0)),
         prepanel=prepanel,
         panel=function(x, y, subscripts, groups, stderr, box.ratio, ...){
             panel.barchart(x, y, subscripts=subscripts,
                            groups=groups, box.ratio=box.ratio,origin=0, ...)
             panel.abline(h=0,col="black",...)
             panel.err(x, y, subscripts=subscripts,
                       groups=groups, box.ratio=box.ratio,stderr=change$stderr)
           }
         )
prepanel=函数(y,stderr,下标=下标,…){

uy谢谢,我会试一试,我也很乐意在晶格中找到一个解决方案,也就是说,如果有人有一个
prepanel=function(y, stderr, subscripts=subscripts, ...){
  uy <- as.numeric(y+stderr[subscripts])
  ly <- as.numeric(y-stderr[subscripts])
  list(ylim=range(y,uy,ly, finite=TRUE))
}
panel.err=function(x, y, subscripts, groups, stderr, box.ratio, ...){
  d <- 1/(nlevels(groups)+nlevels(groups)/box.ratio)
  g <- (as.numeric(groups[subscripts])-1); g <- (g-median(g))*d
  panel.arrows(as.numeric(x)+g,y-stderr[subscripts], as.numeric(x)+g, y+stderr[subscripts],
               code=3,angle=90, length=0.025)
}
barchart(Change~fTreat,groups=Process,change,
         stderr=change$stderr,
         ylab="Pocertage change",
         xlab="Treatment",
         ylim=-115:50,
         auto.key=list(points=FALSE,rectangles=TRUE,columns=2),
         scales=list(alternating=FALSE,
                     tick.number=7,
                     tck=c(-1,0)),
         prepanel=prepanel,
         panel=function(x, y, subscripts, groups, stderr, box.ratio, ...){
             panel.barchart(x, y, subscripts=subscripts,
                            groups=groups, box.ratio=box.ratio,origin=0, ...)
             panel.abline(h=0,col="black",...)
             panel.err(x, y, subscripts=subscripts,
                       groups=groups, box.ratio=box.ratio,stderr=change$stderr)
           }
         )
change <- structure(list(Treat = structure(c(3L, 4L, 1L, 2L, 3L, 4L, 1L, 
2L), .Label = c("12-380", "12-750", "8-380", "8-750"), class = "factor"), 
    Process = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("Respiration", 
    "Calcification"), class = c("ordered", "factor")), Change = c(-33L, 
    -35L, 21L, 18L, 7L, -29L, -8L, -79L), stderr = c(20L, 6L, 
    10L, 9L, 33L, 38L, 21L, 32L), fTreat = structure(c(1L, 2L, 
    3L, 4L, 1L, 2L, 3L, 4L), .Label = c("8-380", "8-750", "12-380", 
    "12-750"), class = c("ordered", "factor"))), .Names = c("Treat", 
"Process", "Change", "stderr", "fTreat"), row.names = c(NA, -8L
), class = "data.frame")