Quantcast

Layout of mulitpage conditioned lattice plots

classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Layout of mulitpage conditioned lattice plots

Dieter Menne
Dear latticists,

I would like to spread a lattice conditioned plot over multiple pages, keeping the same layout as if I had only one page as shown in the code below.

My workaround is to divide the dataframe into subset that fit on one page, but the code is ugly.

Is there a build-in way to achieve this?

Dieter



library(lattice)
nsubj = 13 # This number is variable
dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:nsubj])
dt$val = rnorm(nrow(dt))

#pdf(file="multpageOk.pdf")
# How it should look:
xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3),
  subset=as.integer(subj) <= 10)
#dev.off()

# What to do if it stretches over multiple pages, but I want the same
# layout as above?
pdf(file="multpage.pdf")
xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3))
dev.off()
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

djmuseR
Hi Dieter:

If I read your intention correctly, you need a third element in layout = .
Here's a little example:

df <- data.frame(month = rep(month.abb, each = 20),
                  time = rep(1:20, 12),
                  y = rnorm(240))
xyplot(y ~ time | month, data = df, layout = c(2, 2, 3))

This produces 3 pages of 2 x 2 plots.

Hope this is what you had in mind..

Dennis

On Sun, Dec 19, 2010 at 8:23 AM, Dieter Menne
<[hidden email]>wrote:

>
> Dear latticists,
>
> I would like to spread a lattice conditioned plot over multiple pages,
> keeping the same layout as if I had only one page as shown in the code
> below.
>
> My workaround is to divide the dataframe into subset that fit on one page,
> but the code is ugly.
>
> Is there a build-in way to achieve this?
>
> Dieter
>
>
>
> library(lattice)
> nsubj = 13 # This number is variable
> dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:nsubj])
> dt$val = rnorm(nrow(dt))
>
> #pdf(file="multpageOk.pdf")
> # How it should look:
> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3),
>  subset=as.integer(subj) <= 10)
> #dev.off()
>
> # What to do if it stretches over multiple pages, but I want the same
> # layout as above?
> pdf(file="multpage.pdf")
> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3))
> dev.off()
>
> --
> View this message in context:
> http://r.789695.n4.nabble.com/Layout-of-mulitpage-conditioned-lattice-plots-tp3094581p3094581.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.
>

        [[alternative HTML version deleted]]

______________________________________________
[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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

David Winsemius
In reply to this post by Dieter Menne

On Dec 19, 2010, at 11:23 AM, Dieter Menne wrote:

>
> Dear latticists,
>
> I would like to spread a lattice conditioned plot over multiple pages,
> keeping the same layout as if I had only one page as shown in the code
> below.
>
> My workaround is to divide the dataframe into subset that fit on one  
> page,
> but the code is ugly.
>
> Is there a build-in way to achieve this?
>
> Dieter
>
>
>
> library(lattice)
> nsubj = 13 # This number is variable
> dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:nsubj])
> dt$val = rnorm(nrow(dt))
>
> #pdf(file="multpageOk.pdf")
> # How it should look:
> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3),
>  subset=as.integer(subj) <= 10)
> #dev.off()
>
> # What to do if it stretches over multiple pages, but I want the same
> # layout as above?
> pdf(file="multpage.pdf")
> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3))
> dev.off()

What's not working? I see two pages output with "the same layout". The  
difference is that in the second case your numbers of groups (subj x  
comp)  is not an even multiple of your layout numbers, so the 13 subj  
levels push 3 of the A's onto the new row of panels and so one.....and  
then the second page is partially filled with the 9 remaining "C"'s.

I suppose the fact that I have a default time-stamp for my lattice  
output could have some sort of side-effect.  In my .Rprofile is this  
line:

lattice.options(default.args = list(page = function(n) {
    panel.text(lab = sprintf("%s", date()), x = 0.01, y = 0.01, adj =  
0, srt=90)
}))

--
David Winsemius, MD
West Hartford, CT

 > sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] grid      splines   stats     graphics  grDevices utils      
datasets  methods   base

other attached packages:
  [1] survey_3.22-4   lubridate_0.2.3 circular_0.4    boot_1.2-43      
ggplot2_0.8.8   proto_0.3-8
  [7] reshape_0.8.3   plyr_1.2.1      gridExtra_0.7   gdata_2.8.1      
Hmisc_3.8-3     survival_2.36-1
[13] sos_1.3-0       brew_1.0-4      lattice_0.19-13

loaded via a namespace (and not attached):
[1] cluster_1.13.2 digest_0.4.2   gtools_2.6.2   stringr_0.4    
tools_2.12.0

______________________________________________
[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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

Thomas Adams
In reply to this post by djmuseR
  Dennis,

Thank you; this helps me, too!

Tom

On 12/19/10 11:45 AM, Dennis Murphy wrote:

> Hi Dieter:
>
> If I read your intention correctly, you need a third element in layout = .
> Here's a little example:
>
> df<- data.frame(month = rep(month.abb, each = 20),
>                    time = rep(1:20, 12),
>                    y = rnorm(240))
> xyplot(y ~ time | month, data = df, layout = c(2, 2, 3))
>
> This produces 3 pages of 2 x 2 plots.
>
> Hope this is what you had in mind..
>
> Dennis
>
> On Sun, Dec 19, 2010 at 8:23 AM, Dieter Menne
> <[hidden email]>wrote:
>
>> Dear latticists,
>>
>> I would like to spread a lattice conditioned plot over multiple pages,
>> keeping the same layout as if I had only one page as shown in the code
>> below.
>>
>> My workaround is to divide the dataframe into subset that fit on one page,
>> but the code is ugly.
>>
>> Is there a build-in way to achieve this?
>>
>> Dieter
>>
>>
>>
>> library(lattice)
>> nsubj = 13 # This number is variable
>> dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:nsubj])
>> dt$val = rnorm(nrow(dt))
>>
>> #pdf(file="multpageOk.pdf")
>> # How it should look:
>> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3),
>>   subset=as.integer(subj)<= 10)
>> #dev.off()
>>
>> # What to do if it stretches over multiple pages, but I want the same
>> # layout as above?
>> pdf(file="multpage.pdf")
>> xyplot(val~time|subj+comp, data=dt,type="l",layout=c(10,3))
>> dev.off()
>>
>> --
>> View this message in context:
>> http://r.789695.n4.nabble.com/Layout-of-mulitpage-conditioned-lattice-plots-tp3094581p3094581.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.
>>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> [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.
>


--
Thomas E Adams
National Weather Service
Ohio River Forecast Center
1901 South State Route 134
Wilmington, OH 45177

EMAIL: [hidden email]

VOICE: 937-383-0528
FAX: 937-383-0033

______________________________________________
[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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

Dieter Menne
In reply to this post by djmuseR
djmuseR wrote
If I read your intention correctly, you need a third element in layout = .

df <- data.frame(month = rep(month.abb, each = 20),
                  time = rep(1:20, 12),
                  y = rnorm(240))
xyplot(y ~ time | month, data = df, layout = c(2, 2, 3))

This produces 3 pages of 2 x 2 plots.
Not really. Note that my example is conditioned on 2 variables, and the layout on the first page is the correct one, and by design I use nsubj=13 to show what happens if a page is not filled.

Dieter

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

Dieter Menne
In reply to this post by David Winsemius
David Winsemius wrote

What's not working? I see two pages output with "the same layout". The  
difference is that in the second case your numbers of groups (subj x  
comp)  is not an even multiple of your layout numbers, so the 13 subj  
levels push 3 of the A's onto the new row of panels and so one.....and  
then the second page is partially filled with the 9 remaining "C"'s.
As you noted, the last page is the problem, and nsubj=13 was chosen by design. I am currently looking if ggplot2 can handle this case without large coding overhead.

Dieter

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

Dieter Menne
Here is an example with ggplot2, which can also be used in a similar way with lattice. Again, the last page is the problem: the arrangement is correct here, but the last page (with 1 instead of 5 plots) has a different panel size which makes a comparison difficult.

And, since I have much more points per panel: ggplot2 is slow compared to lattice.

Dieter

library(ggplot2)
nsubj = 11
dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:nsubj])
dt$val = rnorm(nrow(dt))
nPerPage = 5
for (i in seq(1,nsubj,by=nPerPage)) {
  subjs = i:max(i+nPerPage-1,nPerPage)
  print(subjs)
  p = qplot(time,val,data=subset(dt,as.integer(subj) %in% subjs )) +
    geom_line()+ facet_grid(comp ~ subj)+opts(aspect.ratio=1)
  print(p)
}
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

David Winsemius
In reply to this post by Dieter Menne

On Dec 19, 2010, at 1:53 PM, Dieter Menne wrote:

>
>
> David Winsemius wrote:
>>
>>
>>
>> What's not working? I see two pages output with "the same layout".  
>> The
>> difference is that in the second case your numbers of groups (subj x
>> comp)  is not an even multiple of your layout numbers, so the 13 subj
>> levels push 3 of the A's onto the new row of panels and so  
>> one.....and
>> then the second page is partially filled with the 9 remaining "C"'s.
>>
>>
>
> As you noted, the last page is the problem, and nsubj=13 was chosen by
> design. I am currently looking if ggplot2 can handle this case  
> without large
> coding overhead.

I'm obviously not seeing what you think would be an acceptable  
solution. Can you explain in words what you want, rather than what you  
don't want in failed code?

Here's my latest guess at what you may want:

pdf(file="multpage.pdf")
xyplot(val~time|subj + comp, data=dt,type="l",
         layout=c(3,5, 3),
         skip=rep(c(rep(FALSE,13), TRUE, TRUE), 3) )
dev.off()

--

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.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Layout of mulitpage conditioned lattice plots

Dieter Menne
David Winsemius wrote
Here's my latest guess at what you may want:

pdf(file="multpage.pdf")
xyplot(val~time|subj + comp, data=dt,type="l",
         layout=c(3,5, 3),
         skip=rep(c(rep(FALSE,13), TRUE, TRUE), 3) )
dev.off()
Not really, but "skip" was the right idea. I added another idea of Deepayan from a cited thread, first to plot all, then to update indexed parts with a computed skip.

The code has become a bit lengthy because I added a more flexible orphan-avoiding scheme.

Dieter



library(lattice)
# Distribute panels on page, so that each panel has the same size,
# even on last page
# Use adjustCol to adjust colPerPage to avoid orphans on the last page
#

# --------------------- adjustedColPerPage -------------------------------------
adjustedColPerPage = function(colPerPage, ncols){
  # Allow for 20% or plus/minus 2
  searchRange = max(2L,as.integer(colPerPage*0.2))
  colsPerPage = (colPerPage-searchRange):(colPerPage+searchRange)
  nColLast = ncols %% colsPerPage
  nPages = (ncols %/% colsPerPage)+ as.integer(nColLast!=0)
  # Prefer solution with equal number on a page
  matchPage = which(nColLast==0)
  if (length(matchPage) >0) {
    colsPerPage[matchPage[which.min(abs(matchPage-searchRange))]]
  } else {
    colsPerPage[which.max(nColLast)] # not perfect
  }
}

# --------------------- xyPaged ----------------------------------------------
xyPaged = function(x, adjustCol = FALSE, colPerPage = 5,main=NULL) {
  nrows = nlevels(x$comp) # This is not very general
  ncols = nlevels(x$subj) #
  if (adjustCol) # try to get an alternative layout that fits the pages better
  {
    colPerPage = adjustedColPerPage(colPerPage,ncols)
    main = paste(main," usedCol= ",colPerPage)
  }
  p = xyplot(val~time|subj+comp, data=x,type="l",
    layout = c(colPerPage,nrows),main=main)
# http://r-project.markmail.org/thread/rcztoawll5kduw4x
  page = 1
  for (fromCol in seq(1,ncols,by=colPerPage)){
    toCol = min(fromCol+colPerPage-1,ncols)
    showCol = toCol %% colPerPage
    skip = rep(FALSE,colPerPage)
    if (showCol != 0) skip[(showCol+1):colPerPage] = TRUE
    print(update(p[fromCol:toCol],skip=skip,sub=page))
    page = page +1
  }
}

# Test
testFrame  = expand.grid(adjustCol=c(FALSE,TRUE),
         nsubj=c(5,11,13),colPerPage=c(5,9,14) )

pdf(file="multpage.pdf")

for (i in 1:nrow(testFrame)) {
  test = testFrame[i,]
  dt = expand.grid(time=1:20,comp=LETTERS[1:3],subj=letters[1:test$nsubj])
  dt$val = rnorm(nrow(dt))
  with (test, xyPaged(dt,adjustCol, colPerPage,
        main=paste("nsubj=",test$nsubj, " requestedCol= ",colPerPage)))
}
dev.off()
Loading...