[R] Lattice: relation = 'free' in scales

Peter Ehlers ehlers at ucalgary.ca
Tue May 25 18:00:59 CEST 2010


Albart,

On 2010-05-25 1:51, Albart wrote:
>
> Hello list,
>
> I am making graphics for an article which I want to publish. The article is
> about several methods (to calculate breeding values of individuals) applied
> in several genetic scenarios (scen1 in the example) and using data from two
> sources (scen 2 in my example). I want to specify the ylim of my plot and
> have relation = 'free' for the yaxis but I would to avoid plotting the axis
> for each subplot. I include an example to clarify my problem.
>
> require(lattice)
> nmethods<- 3
> nscen1<- 3
> nscen2<- 2
> gens<- 1:10
> tab<- expand.grid(method = 1:nmethods,
>                     scen1 = 1:nscen1,
>                     scen2 = 1:nscen2,
>                     gen = gens,
>                     rep = 1:3)
> tab$value<- rnorm(nrow(tab),mean = with(tab,method*1000 + scen1*10 +
> scen2*10 + gen*100),sd = 100)
>
> tab$color<- factor(tab$scen2)
> levels(tab$color)<- rainbow(length(levels(tab$color)))
> tab$pch<- tab$color
> levels(tab$pch)<- seq(21,21 + length(levels(tab$pch)))
> tab$pch<- as.numeric(as.character(tab$pch))
> tab$color<- as.character(tab$color)
>
> ylim<- with(tab,tapply(value,method,range))
> ylim<- ylim[rep(seq(1,length(ylim)),each = length(unique(tab$scen1)))]
> tab$method<- factor(tab$method)
> tab$scen1<- factor(tab$scen1)
> pplot<- with(tab,xyplot(value~gen|scen1*method,groups = scen2,as.table =
> TRUE,
>                           color = color,pch = pch,
>                           scales = list(alternating = FALSE,y = list(relation
> = 'free',limits = ylim)),
>                           panel = function(x,y,groups,...,subscripts){
>
> tapply(1:length(y),list(x,groups[subscripts]),function(ii){
>                               color<- color[subscripts[ii]]
>                               pch<- pch[subscripts[ii]]
>                               panel.xyplot(mean(x[ii]),mean(y[ii]),fill =
> color,col = color,pch = pch,cex= 0.5)
>                             })},
>                             key = list(columns = 2,
>                               space = "top",text =
> list(unique(as.character(scen2)),col = unique(color)),
>                               points = list(pch = unique(pch),fill =
> unique(color),col = unique(color)))))
>
> As you can see, I use scales = list(y = list(relation = 'free', limit =
> ylim)) because the range differs between the methods and otherwise I loose
> all resolution. I like the result except that the yaxis is now displayed for
> each plot and not only at the left side of the plot. Since I want the same
> plotting range for each row of the plot, this represents an unnecessary use
> of space and I would like to remove these axis from my plot, but I am not
> able to do so. I would appreciate any help.
>

# You can achieve your goal by replacing

scales = list(alternating = FALSE,
   y = list(relation = 'free', limits = ylim)),

# with

L <- vector('list', 9), is.na(L[c(1,4,7)]) <- TRUE,
scales = list(alternating = FALSE,
   y = list(relation= 'free', limits = ylim, at = L)),

# or, equivalently, with

scales = list(alternating = FALSE,
   y = list(relation= 'free', limits = ylim,
     at = list(NA,NULL,NULL,NA,NULL,NULL,NA,NULL,NULL))),

# If you want to move panels closer together, you can add

between = list(x = -1.5),

# to your pplot code.

   -Peter Ehlers



More information about the R-help mailing list