# Drawing a line in xyplot

12 messages
Open this post in threaded view
|
Report Content as Inappropriate

## Drawing a line in xyplot

 This post was updated on . i am trying to replicate the following graph using xyplot : attach(x) plot ( jitter(type), mortality, pch=16,  xlim = c(0.25, 3.75)) lines ( c(1-0.375,1.375) , c ( median(mortality[type==1]), median(mortality[type==1])), lwd=5,col=2) lines ( c(2-0.375,2.375) , c ( median(mortality[type==2]), median(mortality[type==2])), lwd=5,col=2) lines ( c(3-0.375,3.375) , c ( median(mortality[type==3]), median(mortality[type==3])), lwd=5,col=2) detach(x) in the above graph, i draw a median line for "mortality" (range from 5 to 35) by "type" (1,2 or 3).  i now have an additional variable "attend" (0 or 1). within each panel (three panels, one for each "type"), i would like to draw the median "mortality" for each instance of "attend".  i have been able to get as far as plotting everything but the median lines: x11(height=8,width=11) xyplot ( mortality ~ attend|type, panel=function(x,y,subscripts){panel.grid(lty=5); panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)}, strip=strip.custom(which.given=1, bg="orange"),data =x,aspect=2:1,layout=c(3,1)) any suggestions on how to add the median lines of "mortality" for each instance of "attend" within each panel of "type"? thank you
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 On Apr 6, 2012, at 9:41 PM, wcheckle wrote: > i am trying to replicate the following graph using xyplot : > > attach(x) > plot ( jitter(type), mortality, pch=16,  xlim = c(0.25, 3.75)) > lines ( c(1-0.375,1.375) , c ( median(mortality[type==1]), > median(mortality[type==1])), lwd=5,col=2) > lines ( c(2-0.375,2.375) , c ( median(mortality[type==2]), > median(mortality[type==2])), lwd=5,col=2) > lines ( c(3-0.375,3.375) , c ( median(mortality[type==3]), > median(mortality[type==3])), lwd=5,col=2) > detach(x) > > in the above graph, i draw a median line for "mortality" (range from   > 5 to > 35) by "type" (1,2 or 3).  i now have an additional variable   > "attend" (0 or > 1). within each panel (three panel, one for each "type"), i would   > like to > draw the median "mortality" for each instance of "attend".  i have   > been able > to get as far as plotting everything but the median lines: > > x11(height=8,width=11) > xyplot ( mortality ~ attend|type, > panel=function(x,y,subscripts){panel.grid(lty=5); > panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)}, > strip=strip.custom(which.given=1, bg="orange"),data > =x,aspect=2:1,layout=c(3,1)) > > any suggestions on how to add the median lines of "mortality" for each > instance of "attend" within each panel of "type"? Without data, .... I will only offer that there are functions to draw   lines inside lattice panels. (And will not that this information is   also offered on the main ?Lattice page.) ??llines ??panel.abline -- David Winsemius, MD West Hartford, CT ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 In reply to this post by wcheckle here is the data (fyi this is made-up data) x = as.data.frame ( cbind(c(5,8,7,5,8,10,11,6,4,5,20,25,27,30,35,32,28,21,20,34,11,15,18,12,15,12,10,15,19,20), c(1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3),c(1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,0))) names(x)=c("mortality","type","attend") here is the image: revised code with image: x11(height=8,width=11) xyplot ( mortality ~ factor(attend)|type, panel=function(x,y){panel.grid(lty=5); panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)}, strip=strip.custom(which.given=1, bg="orange"),data =x,aspect=2:1,layout=c(3,1)) i am trying to replicate the "red" mean lines on the xyplot graph abline won't do it.  llines may be able to do it, but i don't know how to use/implement thanks
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 On Apr 7, 2012, at 11:35 AM, wcheckle wrote: > here is the data (fyi this is made-up data) > > x = as.data.frame ( > cbind > (c > (5,8,7,5,8,10,11,6,4,5,20,25,27,30,35,32,28,21,20,34,11,15,18,12,15,12,10,15,19,20 > ), > c > (1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3 > ),c(1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,0))) > names(x)=c("mortality","type","attend") Sidebar not related to the question at hand: I would like to get hands   on the person who is teaching the malpractice of using the form   as.data.frame(cbind(vectors)))  and ....what would be sufficiently   motivational?  ... strangulation would be a bit severe, but perhaps   carefully applied thumb pressure to the cricoid cartilage for   sufficient interval to gain attention? I have seen several instances   of that (mal)form in various rhelp-ish venues in the last couple of   weeks and it is a common source of obscure error. xdat = data.frame ( mortality =c(5,   8,7,5,8,10,11,6,4,5,20,25,27,30,35,32,28,21,20,34,11,15,18,12,15,12,10,15,19,20 ), type= c(1, 1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3),   attend c(1, 0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,0)) The reason for NOT using cbind is that it forces all vectors to have   the same mode.  The whole point of having data.frames is to allow you   to mix modes. So that constriction is completely boneheaded. And please learn to use spaces. > > here is the image: > http://r.789695.n4.nabble.com/file/n4539596/x.jpg> > revised code with image: > > x11(height=8,width=11) > xyplot ( mortality ~ factor(attend)|type, > panel=function(x,y){panel.grid(lty=5); > panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)}, > strip=strip.custom(which.given=1, bg="orange"),data > =x,aspect=2:1,layout=c(3,1)) > > http://r.789695.n4.nabble.com/file/n4539596/x1.jpg> > i am trying to replicate the "red" mean lines on the xyplot graph > > abline won't do it.  llines may be able to do it, but i don't know   > how to > use/implement > I didn't say to 'abline'. I said 'panel.abline' and the help page for   panel.abline also include 'panel.segments' which it becomes clear you   wanted ...  now that we have data and can see what you were looking at. xyplot(mortality ~ type, data=xdat,                 panel=function(x,y){                     panel.xyplot(x,y, jitter.x=TRUE)                     panel.segments(x0=c(.9, 1.9, 2.9),                                     x1=c(1.1,2.1,3.1),                                     y0=tapply(xdat\$mortality, xdat \$type, median),                                     y1=tapply(xdat\$mortality, xdat \$type, median),                               col="red", lwd=3 )                         }) > thanks > > > > -- > View this message in context: http://r.789695.n4.nabble.com/Drawing-a-line-in-xyplot-tp4538689p4539596.html> Sent from the R help mailing list archive at Nabble.com. > > ______________________________________________ > [hidden email] 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. David Winsemius, MD West Hartford, CT ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 On Sat, Apr 7, 2012 at 11:16 AM, David Winsemius <[hidden email]> wrote: > xyplot(mortality ~ type, data=xdat, >               panel=function(x,y){ >                   panel.xyplot(x,y, jitter.x=TRUE) >                   panel.segments(x0=c(.9, 1.9, 2.9), >                                   x1=c(1.1,2.1,3.1), >                                   y0=tapply(xdat\$mortality, xdat\$type, > median), >                                   y1=tapply(xdat\$mortality, xdat\$type, > median), >                             col="red", lwd=3 ) > >                       }) > Actually the OP had formula = mortality ~ factor(attend)|type, (two conditioning factors). This approach will work but will require 1)  replace type with attend in tapply 2) subset conditional on packet.number 3) loop over the segments for the two sets of x-coords An alternative will be bwplot(mortality ~ factor(attend)|type,data=xdat,  pch=95,cex=5,col=2,  par.settings=list(   box.rectangle = list(col = 'transparent'),   box.umbrella = list(col = 'transparent')  ),  panel=function(x,y,...){   panel.grid(lty=5)   panel.bwplot(x,y,...)   panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)  } ) Hope this helps > >> thanks >> >> >> >> -- >> View this message in context: >> http://r.789695.n4.nabble.com/Drawing-a-line-in-xyplot-tp4538689p4539596.html>> Sent from the R help mailing list archive at Nabble.com. >> >> ______________________________________________ >> [hidden email] 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. > > > David Winsemius, MD > West Hartford, CT > > > ______________________________________________ > [hidden email] 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. ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 In reply to this post by wcheckle Thank you David, the bwplot option does what I need: x11(height=8,width=11) bwplot ( mortality~ attend|type,  pch=95,cex=5,col=2,  par.settings=list(   box.rectangle = list(col = "transparent"),   box.umbrella = list(col = "transparent"),   plot.symbol = list(col = "transparent")  ),  panel=function(x,y,...){   panel.grid(lty=5)   panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1)   panel.bwplot(x,y,...)  }, data = x,aspect=2:1,layout=c(3,1)) However, I am interested in also learning how to do it in xyplot as well.  I wasn’t able to follow the last two set of instructions (condition on packet.number and loop over segments), wondering if I can ask for your help for the correct code (my attempt resulted in all three mean lines within each panel): x11(height=8,width=11) xyplot ( mortality ~ attend|type, panel=function(x,y) { panel.grid(lty=5) panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1) for(i in 1:3) { panel.segments(x0=c(0.7, 1.7), x1=c(1.3, 2.3), y0=c(tapply(x\$mortality[x\$type==i], x\$attend[x\$type==i], median)), y1=c(tapply(x\$mortality[x\$type==i], x\$attend[x\$type==i], median)),col="red",lwd=4) } }, data = x,aspect=2:1,layout=c(3,1)) thank you again. I also found your info on data.frame useful.
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 On Apr 7, 2012, at 10:29 PM, wcheckle wrote: > Thank you David, the bwplot option does what I need: > > x11(height=8,width=11) > bwplot ( mortality~ attend|type, > pch=95,cex=5,col=2, > par.settings=list( >  box.rectangle = list(col = "transparent"), >  box.umbrella = list(col = "transparent"), >  plot.symbol = list(col = "transparent") > ), > panel=function(x,y,...){ >  panel.grid(lty=5) >  panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1) >  panel.bwplot(x,y,...) > }, > data = x,aspect=2:1,layout=c(3,1)) > > > However, I am interested in also learning how to do it in xyplot as   > well.  I > wasn’t able to follow the last two set of instructions (condition on > packet.number and loop over segments), wondering if I can ask for   > your help > for the correct code (my attempt resulted in all three mean lines   > within > each panel): > > x11(height=8,width=11) > xyplot ( mortality ~ attend|type, > panel=function(x,y) > { > panel.grid(lty=5) > panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1) > for(i in 1:3) > { > panel.segments(x0=c(0.7, 1.7), > x1=c(1.3, 2.3), > y0=c(tapply(x\$mortality[x\$type==i], x\$attend[x\$type==i], median)), > y1=c(tapply(x\$mortality[x\$type==i], x\$attend[x\$type==i], > median)),col="red",lwd=4) > } > }, > data = x,aspect=2:1,layout=c(3,1)) > > thank you again. I also found your info on data.frame useful.   I haven't figured out how to do it with the interaction of 'attend'   and ''type' from inside xyplot. I'm thinking I might be able to   succeed using trellis.focus() to address separate "columns" within a   particular panel. This will draw  segments at (1,20) and (2,30) without resorting to low   level grid/viewport stuff.   trellis.unfocus(); trellis.focus("panel", 1, 1)   do.call("panel.segments", list(x0=1,y0=20,x1=1.2, y1=20))   trellis.unfocus()   trellis.unfocus(); trellis.focus("panel", 1, 1)   do.call("panel.segments", list(x0=2,y0=30,x1=2.2, y1=30))   trellis.unfocus() -- David David Winsemius, MD West Hartford, CT ______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-helpPLEASE do read the posting guide http://www.R-project.org/posting-guide.htmland provide commented, minimal, self-contained, reproducible code.
Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

Open this post in threaded view
|
Report Content as Inappropriate

## Re: Drawing a line in xyplot

 In reply to this post by wcheckle i appreciate all the interest in my question, and thank you Elai for both of your suggestions, which work very well. Elai, your last code was particularly simple and helpful to generate the figure i was looking for. x11(height=8,width=11) par(lend=2) xdat = data.frame(mortality =c(5, 8,7,5,8,10,11,6,4,5,20,25,27,30,35,32,28,21,20,34,11,15,18,12,15,12,10,15,19,20), type= c(1, 1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3), attend = c(1, 0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,0)) xyplot ( mortality ~ factor(attend)|type, panel=function(x,y) { panel.grid(lty=5) panel.xyplot(x,y,pch=16,jitter.x=TRUE,col=1) yy<- tapply(y,x,median) panel.segments(x0=c(0.7,1.7), x1=c(1.3,2.3), y0= yy , y1= yy , col="red",lwd=5) }, data = xdat, aspect=2:1,layout=c(3,1)) as a side note, the par(lend=2) function did not square the ends of the lines for panel.segments in xyplot (i was trying to get square ends instead of round ends). John: thank you for your information regarding latticeExtra and the layer function, which will be helpful for future figures.