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/