packet.number() will retrieve the panel you are working in. With a third conditioning variable, you now have say a list of *.err$x, one for each panel/level of 3rd var. In that case you need dsl[[packet.number()]] to get at the right place in the list (or [,packet.number()] if it's a matrix etc.). Regarding the calculations, you could type panel.barchart in the console to see Deepayan's original. Sorry but I just don't remember what my logic was when figuring it out (it has been a short while since my last barchart), was probably just trial and error until it worked. Best,
On Sun, Mar 4, 2012 at 1:15 PM, Nathan Lemoine <lemoine.nat...@gmail.com> wrote: > Also, can you tell me where to add the [[packet.number()]] command for > condition? I've been trying several things with no luck. > > Thanks for helping, sorry if I'm a nuisance, but I'm still learning my way > around the more advanced functions and there's no one else at my university > that uses R as extensively as I do. > > Nathan On Sun, Mar 4, 2012 at 11:45 AM, Nathan Lemoine <lemoine.nat...@gmail.com> wrote: > Thanks! I really appreciate the help, I don't think I ever would have figured > that out. > > If you don't mind, I like to understand exactly whats going on in the code. > > I see groupS identifies the start center of each group and identifies which > group each row belongs to > w calculates the half-width of each bar with respect to the whole group of > bars (i.e. a bar with a width of 1in a group of three bars has a half width > of 1/6) > groupS - (nv+1)/2 gives each bar's relative position to the central bar > > Am I interpreting these correctly? One thing I don't get is where 3/4 came > from. > > Anyway, thanks for all of the help. Wouldn't have gotten it on my own > > Nathan > > > On Mar 3, 2012, at 9:46 PM, ilai wrote: > >> On Sat, Mar 3, 2012 at 5:48 PM, Nathan Lemoine <lemoine.nat...@gmail.com> >> wrote: >>> It appears that the subscripts are only passing two values, the center of >>> each group. There should be six values, one for the center of each bar >>> (correct?), >> >> No. That's also why your code doesn't work. x[subscripts] are not the >> centroids. To my knowledge there isn't a barchart equivalent to >> boxplot.stats which means for placement you need to recalculate the >> location of the bars, as is done internally in panel.barchart. This >> panel function may need some tweaking depending on complexity of the >> real data (for conditioning add [[packet.number()]] / for limits and >> scales - a little more work) but hopefully help get you started: >> >> growth <- c(6.6,7.2,6.9,8.3,7.9,9.2,8.3,8.7,8.1,8.5,9.1,9.0) >> diet <- as.factor(rep(c("A","B","C"),2,each=2)) >> coat <- as.factor(rep(c("light","dark"),each=6)) >> growth.means <- aggregate(growth,list(coat,diet),mean) >> growth.errs <- aggregate(growth,list(coat,diet),sd) >> require(lattice) >> panel.ci <- function(x, y, sdl, groups, subscripts,box.ratio=box.ratio, ...){ >> groupS <- as.numeric(groups[subscripts]) >> nv <- nlevels(groups) >> w <- box.ratio/(nv*(1 + box.ratio)) >> yy <- as.numeric(y)+sdl >> xx <- as.numeric(x)+(3/4)*w*(groupS - (nv + 1)/2) >> panel.barchart(x, y,groups=groups,subscripts=subscripts,...) >> panel.segments(xx,as.numeric(y),xx,yy,lwd=2) >> } >> barchart(x~Group.1, groups=Group.2,data=growth.means,sdl=growth.errs$x, >> horiz=F,stack=F, >> ylim=c(0,max(growth.errs$x+growth.means$x)+.2), panel=panel.ci) >> >> Cheers >> Elai >> >> >> but I have no idea how to fix that or what I've done wrong. Here's the >> (corrected) code I've got so far... >>> >>> growth <- c(6.6,7.2,6.9,8.3,7.9,9.2,8.3,8.7,8.1,8.5,9.1,9.0) >>> diet <- as.factor(rep(c("A","B","C"),2,each=2)) >>> coat <- as.factor(rep(c("light","dark"),each=6)) >>> >>> growth.means <- aggregate(growth,list(coat,diet),mean) >>> colnames(growth.means)[3] <- "growth" >>> >>> library(lattice) >>> >>> panel.ci <- function(x, y, subscripts, ...){ >>> panel.barchart(x, y, horiz=F, subscripts=subscripts, >>> groups=growth.means$Group.2, ...) >>> panel.segments(x[subscripts], y, x[subscripts], y+0.5) >>> print(x[subscripts]) >>> } >>> >>> barchart(growth~Group.1, groups=Group.2, data=growth.means, >>> col=c(1,2,3), >>> panel=panel.superpose, >>> panel.groups=panel.ci >>> ) >>> >>> Begin forwarded message: >>> >>>> From: Nathan Lemoine <lemoine.nat...@gmail.com> >>>> Date: March 2, 2012 11:53:24 PM EST >>>> To: r-help@r-project.org >>>> Subject: Grouped barchart confidence intervals in lattice >>>> >>>> Hi everyone, >>>> >>>> I'm having trouble adding error bars to a grouped barchart in lattice. I >>>> know that this topic has been addressed quite a bit, as I've been >>>> searching the internet for a while to try to troubleshoot the issue, but >>>> I've not been able to find any solution that I could get working on my >>>> data. I was wondering if someone could look at my code and tell me what >>>> I'm doing wrong. I was hoping somebody's found a way to do this (I'm sure >>>> they have) and can tell me how to fix my code. >>>> >>>> # Input example data >>>> >>>> growth <- c(6.6,7.2,6.9,8.3,7.9,9.2,8.3,8.7,8.1,8.5,9.1,9.0) >>>> diet <- as.factor(rep(c("A","B","C"),2,each=2)) >>>> coat <- as.factor(rep(c("light","dark"),each=6)) >>>> >>>> growth.means <- aggregate(growth,list(coat,diet),mean) >>>> >>>> library(plotrix) >>>> >>>> growth.errs <- aggregate(growth,list(coat,diet),std.error) >>>> >>>> # Try using the superpose call with panel.groups results in an error >>>> >>>> panel.ci <- function(x, y, subscripts, groups...){ >>>> panel.barchart(x, y, groups=groups, subscripts=subscripts, >>>> horiz=F,...) >>>> panel.segments(x[subscripts], y, x[subscripts], y+growth.errs$x, >>>> col = 'black') >>>> } >>>> >>>> barchart(growth~Group.1, groups=Group.2, data=growth.means, >>>> panel=panel.superpose, >>>> panel.groups=panel.ci >>>> ) >>>> >>>> # Try using the generic plot.barchart command gives three error bars, all >>>> are the appropriate sizes, but all are centered in each group and not on >>>> the grouped bars >>>> >>>> barchart(x~Group.1, groups=Group.2, data=growth.means, >>>> panel=function(x,y,subscripts, groups){ >>>> panel.barchart(x,y,horiz=F,groups=groups, subscripts=subscripts) >>>> >>>> panel.segments(as.numeric(x)[subscripts],y,as.numeric(x)[subscripts],y+growth.errs$x) >>>> } >>>> ) >>>> >>>> What am I doing wrong? >>>> >>>> Thanks, >>>> >>>> Nathan Lemoine >>>> >>>> >>>> >>>> >>>> >>>> >>>> >>> >>> >>> [[alternative HTML version deleted]] >>> >>> ______________________________________________ >>> R-help@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-help >>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >>> and provide commented, minimal, self-contained, reproducible code. > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.