Boris:

If I understand you correctly, you wish to set panel limits by row. I
know of no "slick" way of doing this (others may), as what is in a row
can change depending on layout and how you determine the scale for the
rows' contents may depend on the application context.

So I would do it manually: First, outside of trellis, compute your
xlim and ylim values for each row as you desire. Then issue the
trellis call, with the relation="free" component in the scales = list,
Then just use the list form of the xlim and ylim argument to xyplot
with your precomputed limits.

-- Bert

On Mon, Feb 18, 2013 at 8:40 AM, Boris Vasiliev <bvasil...@yahoo.com> wrote:
> Hi Duncan,
>
> Thank you for quick reply.
>
> I am not sure that your solution solves the problem.  If I use
> useOuterStrips(dotplot(count ~ subject|risk*treatment,df))
> the order of subjects and panel y-limits in each panel are
>
> A, B, BB, CCC, DD, FFFF.
>
> However, the order of subjects and y-limits which I would
> like to get are
>
> Panels 1,2,3 (row 1): A, B
>
> Panels 4,5,6 (row 2): DD, A, FFFF
>
> Panels 7,8,9 (row 3): BB, CCC, A.
>
> I can re-index subjects so that they have correct order in each row.
> However, I am not sure how to specify per-panel y-limits in lattice
> so that all panels in the same row have the same y-limits irrespective
> of what data is in these panels.
>
> With relation "same", the limits are the same for all plots; with
> relation "free" the limits depend on the data in the panel.  I thought
> that relation "free" and specification of y-limits via prepanel
> function (my previous trys) or as a list would do the trick:
> scales=list(y=list(limits=list(panel-1-limits, panel-2-limits, ...))
> but I cannot get it to work.
>
> I guess I am missing something basic ... any ideas or advice to give
> up are greatly appreciated.
>
> Regards,
> Boris.
>
>
>
> Hi Boris
>
> Not sure what you mean exactly
> try
>
> library(latticeExtra)
> useOuterStrips(dotplot(count ~ subject|risk*treatment,df))
>
> if you want to change the order of the subjects in each panel and an
> index column and plot the index column instead of subject and change
> the scales to suit.
>
> HTH
>
> Duncan
>
> Duncan Mackay
> Department of Agronomy and Soil Science
> University of New England
> Armidale NSW 2351
> Email: home: mackay at northnet.com.au At 07:54 16/02/2013, you wrote:
>>Good afternoon, >>I would like to ask for help in controlling y-axis limits 
>>and labels in >lattice doplots.  Unfortunately, the problem is somewhat 
>>convoluted, >please bear with the long explanation. >>I would like to create 
>>a 3x3 lattice of dotplots, say subject ~ count. >The plot is conditioned on 
>>variables treatment and risk: subject ~ count >|treatment + risk.  In the 
>>experiment,  not all subjects were exposed >to all combinations of treatment 
>>and risk.  For each risk, I would like >to show subject ~ count | treatment 
>>and order the subjects by the total >count.  At the same time, I would like 
>>the x-axes to be the same in all >panels and aligned by columns. >>Here is a 
>>sample data set: >># raw data >df <- 
>>data.frame(subject=c('A','A','A','BB','BB','CCC','CCC','CCC', 
>>>'DD','DD','A','A','A','FFFF','FFFF', >'A','A','B','B'), 
>>>>risk=c('high','high','high','high','high','high','high','high', 
>>>'med','med','med','med','med','med','med',
>  >'low','low','low','low'), 
> >>treatment=c('none','optX','optZ','none','optZ','none','optX','optZ', 
> >>'none','optZ','none','optX','optZ','none','optZ', 
> >'none','optX','none','optZ'), >count=c(5,10,2,3,5,8,1,2, >3,7,10,2,5,15,2, 
> >7,7,10,8)) ># re-level factors >df$risk <- 
> factor(df$risk,levels=c('low','med','high')) >df$treatment <- 
> factor(df$treatment,levels=c('none','optX','optZ')) >>>## > df >##    subject 
> risk treatment count >## 1        A high      none     5 >## 2        A high  
>     optX    10 >## 3        A high      optZ     2 >## 4       BB high      
> none     3 >## 5       BB high      optZ     5 >## 6      CCC high      none  
>    8 >## 7      CCC high      optX     1 >## 8      CCC high      optZ     2 
> >## 9       DD  med      none     3 >## 10      DD  med      optZ     7 >## 
> 11       A  med      none    10 >## 12       A  med      optX     2 >## 13    
>    A  med      optZ     5 >## 14    FFFF  med      none    15 >## 15    FFFF  
> med      optZ
>   2 >## 16       A  low      none     7 >## 17       A  low      optX     7 
> >## 18       B  low      none    10 >## 19       B  low      optZ     8 >>One 
> way to plot the data is to break-up the data into sub-frames, one >frame for 
> each risk, order subjects by total counts, create dotplots, >and merge with 
> trellis.c().  This almost works but in the merged plot I >cannot decrease 
> column spacing to be small enough.  Also, the output of >trellis.c() would 
> not work with useOuterStrips() which I really like. >My code is in TRY ONE 
> below. >>Another way to create the plot is specify y-limits for each panel 
> with >custom prepanel and panel functions.  For each panel, the data-frame 
> for >the panel row is isolated, subjects in the data-frame for the current 
> >row are ordered by counts, panel y-limits are set to the re-ordered >levels, 
> y-data for each panel is releveled, and data plotted with >standard 
> panel.dotplot().  This somewhat works but lattice does not >honour
>  the user-defined y-limits and labels are not correct.  I suspect >that it is 
> not correct to use  y-relation="same" in this case but "free" >and "sliced" 
> do not give correct results too. My code in in TRY TWO >below. >>If anybody 
> can offer any assistance with this problem, it would be much >appreciated, 
> >Sincerely, >Boris. >>>#### BEGIN TRY ONE - MERGE LATTICE PLOTS #### 
> >library(lattice) >library(latticeExtra) >library(grid) >>for (irisk in 
> levels(df$risk)) { ># subset data frame >df.irisk <- subset(df,risk==irisk) 
> >># order subjects by total count; store levels of subjectx variables ># for 
> later re-use in panel labels >df.irisk$subjectx <- 
> df.irisk$subject[,drop=TRUE] >df.irisk$subjectx <- 
> reorder(df.irisk$subjectx,df.irisk$count,sum) 
> >assign(paste('sbjx.',irisk,sep=''),levels(df.irisk$subjectx)) >># create 
> dotplot and store it in oltc.{irisk} variable >oltc.irisk <- 
> dotplot(subjectx~count|treatment,data=df.irisk, 
> >layout=c(3,1),type=c('p','h'),
>  >xlim=c(-1,16),origin=0, >xlab="",ylab="") 
> >assign(paste('oltc.',irisk,sep=''),oltc.irisk) >} >># combine everthing in 
> one plot >oltc <- c(low=oltc.low,med=oltc.med,high=oltc.high) >print(oltc) 
> >># get rid of variable labels in middle and right column; decrease ># 
> distance between columns.  But can't make inter-column spaces ># small 
> enought and get rid of the panels in all but top rows. >laywid <- 
> trellis.par.get('layout.widths') >laywid$between <- -5 >laywid$axis.panel <- 
> 0.7 >yscales <- list(labels=list(sbjx.low,NULL,NULL, >sbjx.med,NULL,NULL, 
> >sbjx.high,NULL,NULL)) >oltd <- update(oltc,scales=list(y=yscales), 
> >par.settings=list(layout.widths=laywid)) >print(oltd) >>#### END TRY ONE - 
> MERGE LATTICE PLOTS #### >>#### BEGIN TRY TWO - CUSTOM PREPANEL AND PANEL 
> FUNCTIONS #### >>prepanel.dotplot.x <- 
> function(x,y,type,subscripts,...,data=NULL) { ># find data-frame that 
> corresponds to the entire row of the plot >irisk <-
>  levels(data$risk[subscripts,drop=TRUE]) >idata <- subset(data,risk==irisk) 
> >># in the sub-frame, order subjects by total counts >idata$subjectx <- 
> reorder(idata$subject[,drop=TRUE],idata$count,sum) >># set y-limits >ylim <- 
> levels(idata$subjectx) >># increment packet counter and print new panel 
> limits >pcknum = lattice.options()$packet.counter 
> >lattice.options(packet.counter=pcknum+1) 
> >cat(paste(pcknum,":",paste(ylim,collapse=", ")),sep="\n") 
> >return(list(ylim=ylim)) >} >>panel.dotplot.x <- 
> function(x,y,type,subscripts,...,data=NULL) { ># get the sub-frame for the 
> row >irisk <- levels(data$risk[subscripts,drop=TRUE]) >idata <- 
> subset(data,risk==irisk) >># in the sub-frame, order subjects by total counts 
> >idata$subjectx <- reorder(idata$subject[,drop=TRUE],idata$count,sum) >># 
> re-order y-variable to "correct levels" >y <- 
> factor(as.character(y),levels(idata$subjectx)) >># print levels of the 
> releveled subjects - should be the same ># as the output of
>  prepanel.dotplot.x >pnlnum <- panel.number() 
> >cat(paste(pnlnum,':',paste(levels(y),collapse=", ")),sep="\n") >># call 
> standard dotplot >panel.dotplot(x,y,...) >} >># the data is plotted correctly 
> but the labels and limits are not >correct >lattice.options(packet.counter=1) 
> >oltc <- dotplot(subject~count|treatment+risk,data=df, 
> >layout=c(3,3),subscripts=TRUE, >prepanel=function(...) 
> >{prepanel.dotplot.x(...,data=df)}, 
> >panel=function(...){panel.dotplot.x(...,data=df)}, 
> >scales=list(y=list(relation='same')), >drop.unused.levels=FALSE, 
> >xlim=c(0,16)) >print(oltc) >>#### END TRY TWO - CUSTOM PANEL AND PREPANEL 
> FUNCTIONS #### >>______________________________________________ >R-help at 
> 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.
>         [[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.



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm

______________________________________________
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.

Reply via email to