Hi, I want to insert a key into each panel of a trellis plot, which I can do with a custom panel function that calles draw.key. The problem arises because I want the top right hand corner of the key to start in the top right hand corner of the panel. If you run my code below, you can see that the key appears in the center of each panel. This is because the default viewport in draw.key is the same size as the panel. I can readily change the height and width of the viewport such that only the key will fit (i.e., viewport and key are the same size). While this works, it is not a robust solution. For example, if I change cex or resize, then I have to guess again what size viewport will be needed to fit only the key. How can I specify a viewport size that will always only fit the key itself? If I could do that, then I could have much more robust control over the key's position on the panel. That is, I could always specify the top right corner of the key to be at top right corner of the panel. In other words, if I had access to the width and height of the key in "npc" coordinates I could specify that in my viewport argument. But, I don't know how to access them without making a series of guesses. Below is example code. Thanks, Steve #### build a dataframe dataframe<-data.frame(condition=factor(rep(c("A","B","C","D"),c(40,40,40,40) ),levels=c("A","B","C","D")), var1=rnorm(160), var2=rep(c(1:40),4), parm1=rep(c(987.54,754,887.654,902),c(40,40,40,40)), parm2=rep(c(254.89,376.001,308,297.102),c(40,40,40,40)), parm3=rep(c(0.2,38.5,1.5,0.654),c(40,40,40,40))) ####Use xyplot to plot var1 against var2 for each condition. No problem. xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4)) ####Now I want to add a key to each panel indicating the values on the parameters 1-3. ####To do so I write my own panel function that calls draw.key tmp.xyplot <- function(x,y,subscripts=subscripts,cdata=cdata){ # plot data points panel.xyplot(x,y) # extract parameter values right <- as.character(cdata[subscripts,][1,c(4,5,6)]) #### draw the key on the panel draw.key(list(text=list(expression(t[1],t[infinity],"p")), text=list(c("=","=","=")), text=list(right), between=c(0.4), rep=FALSE, columns=1, column.between=0), draw=TRUE) } #### call xyplot with tmp.xyplot panel function xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4),panel=tmp.xyplot,cdat a=dataframe) [[alternative HTML version deleted]]
Hi, In my previous posting I forgot my system information. Sorry. It is listed below. I want to insert a key into each panel of a trellis plot, which I can do with a custom panel function that calles draw.key. The problem arises because I want the top right hand corner of the key to start in the top right hand corner of the panel. If you run my code below, you can see that the key appears in the center of each panel. This is because the default viewport in draw.key is the same size as the panel. I can readily change the height and width of the viewport such that only the key will fit (i.e., viewport and key are the same size). While this works, it is not a robust solution. For example, if I change cex or resize, then I have to guess again what size viewport will be needed to fit only the key. How can I specify a viewport size that will always only fit the key itself? If I could do that, then I could have much more robust control over the key's position on the panel. That is, I could always specify the top right corner of the key to be at top right corner of the panel. In other words, if I had access to the width and height of the key in "npc" coordinates I could specify that in my viewport argument. But, I don't know how to access them without making a series of guesses. Below is example code. Thanks, Steve #### build a dataframe dataframe<-data.frame(condition=factor(rep(c("A","B","C","D"),c(40,40,40,40) ),levels=c("A","B","C","D")), var1=rnorm(160), var2=rep(c(1:40),4), parm1=rep(c(987.54,754,887.654,902),c(40,40,40,40)), parm2=rep(c(254.89,376.001,308,297.102),c(40,40,40,40)), parm3=rep(c(0.2,38.5,1.5,0.654),c(40,40,40,40))) ####Use xyplot to plot var1 against var2 for each condition. No problem. xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4)) ####Now I want to add a key to each panel indicating the values on the parameters 1-3. ####To do so I write my own panel function that calls draw.key tmp.xyplot <- function(x,y,subscripts=subscripts,cdata=cdata){ # plot data points panel.xyplot(x,y) # extract parameter values right <- as.character(cdata[subscripts,][1,c(4,5,6)]) #### draw the key on the panel draw.key(list(text=list(expression(t[1],t[infinity],"p")), text=list(c("=","=","=")), text=list(right), between=c(0.4), rep=FALSE, columns=1, column.between=0), draw=TRUE) } #### call xyplot with tmp.xyplot panel function xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4),panel=tmp.xyplot,cdat a=dataframe) platform i386-pc-mingw32 arch i386 os mingw32 system i386, mingw32 status major 1 minor 8.1 year 2003 month 11 day 21 language R [[alternative HTML version deleted]]
Hi Here's a modification of your panel function that I think does what you want (comments embedded): tmp.xyplot <- function(x,y,subscripts=subscripts,cdata=cdata){ # plot data points panel.xyplot(x,y) # extract parameter values right <- as.character(cdata[subscripts,][1,c(4,5,6)]) #### Create the key for the panel key <- draw.key(list(text=list(expression(t[1],t[infinity],"p")), text=list(c("=","=","=")), text=list(right), between=c(0.4), rep=FALSE, columns=1, column.between=0), draw=FALSE) #### Push a viewport in the top-right corner which is #### big enough to fit the key #### Uses grobWidth() and grobHeight() to get the size of the key #### (You'll need a library(grid) somewhere to direct access #### to these grid functions) pushViewport(viewport(x=1, y=1, width=grobWidth(key), height=grobHeight(key), just=c("right", "top"))) #### Draw the key grid.draw(key) #### Pop the key viewport popViewport() } Hope that helps Paul Steven Lacey wrote:> Hi, > > > > I want to insert a key into each panel of a trellis plot, which I can do > with a custom panel function that calles draw.key. The problem arises > because I want the top right hand corner of the key to start in the top > right hand corner of the panel. If you run my code below, you can see that > the key appears in the center of each panel. This is because the default > viewport in draw.key is the same size as the panel. I can readily change the > height and width of the viewport such that only the key will fit (i.e., > viewport and key are the same size). While this works, it is not a robust > solution. For example, if I change cex or resize, then I have to guess again > what size viewport will be needed to fit only the key. How can I specify a > viewport size that will always only fit the key itself? If I could do that, > then I could have much more robust control over the key's position on the > panel. That is, I could always specify the top right corner of the key to be > at top right corner of the panel. > > > > In other words, if I had access to the width and height of the key in "npc" > coordinates I could specify that in my viewport argument. But, I don't know > how to access them without making a series of guesses. > > > > Below is example code. > > > > Thanks, > Steve > > > > #### build a dataframe > > dataframe<-data.frame(condition=factor(rep(c("A","B","C","D"),c(40,40,40,40) > ),levels=c("A","B","C","D")), > > var1=rnorm(160), > > var2=rep(c(1:40),4), > > parm1=rep(c(987.54,754,887.654,902),c(40,40,40,40)), > > > parm2=rep(c(254.89,376.001,308,297.102),c(40,40,40,40)), > > parm3=rep(c(0.2,38.5,1.5,0.654),c(40,40,40,40))) > > > > ####Use xyplot to plot var1 against var2 for each condition. No problem. > > xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4)) > > > > ####Now I want to add a key to each panel indicating the values on the > parameters 1-3. > > ####To do so I write my own panel function that calls draw.key > > > > tmp.xyplot <- function(x,y,subscripts=subscripts,cdata=cdata){ > > # plot data points > > panel.xyplot(x,y) > > > > # extract parameter values > > right <- as.character(cdata[subscripts,][1,c(4,5,6)]) > > > > #### draw the key on the panel > > draw.key(list(text=list(expression(t[1],t[infinity],"p")), > > text=list(c("=","=","=")), > > text=list(right), > > between=c(0.4), > > rep=FALSE, > > columns=1, > > column.between=0), > > draw=TRUE) > > > > } > > > > #### call xyplot with tmp.xyplot panel function > > xyplot(var1~var2|condition,data=dataframe,ylim=c(4,-4),panel=tmp.xyplot,cdat > a=dataframe) > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html-- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/
Hi Steven Lacey wrote:> In my previous posting I forgot my system information. Sorry. It is listed > below.<snip>> platform i386-pc-mingw32 > arch i386 > os mingw32 > system i386, mingw32 > status > major 1 > minor 8.1 > year 2003 > month 11 > day 21 > language RIn that case, for the modifications I suggested, you may have to change pushViewport to push.viewport and popViewport to pop.viewport, and grobWidth(key) to unit(1, "grobwidth", key) and grobHeight(key) to unit(1, "grobheight", key), but hopefully then it will still work. Paul -- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/