Marius Hofert
2010-May-06 06:46 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
Dear R experts,
I have four plots I would like to plot attached to each other (in panels).
All plots have the same x-scale, but different y-scales. The example below shows
pretty much what I would like to have, except that for the two plots in the
"second column" (of this 2x2 plot-matrix), I would like to have the
y-ticks
shown on the right side such that the four plot panels are attached to each
other/glued
together. How can I achieve this?
I found a solution for a 2x1 matrix in the R-help archive, but this problem here
is different.
Cheers,
Marius
Ps: I guess the "scales=..." should somehow go inside the panel
function, so that
the panel number tells the "alternating"-argument where it has to
print the ticks.
library(lattice)
x=rep(c(1,2,3),4) # x values
y=1:12 # y values
z=rep(1:4,each=3) # panel number
xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)),
panel=function(...){
panel.xyplot(...,col=1)
}
)
Deepayan Sarkar
2010-May-06 11:53 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
On Thu, May 6, 2010 at 12:16 PM, Marius Hofert <m_hofert at web.de> wrote:> Dear R experts, > > I have four plots I would like to plot attached to each other (in panels). > All plots have the same x-scale, but different y-scales. The example below shows > pretty much what I would like to have, except that for the two plots in the > "second column" (of this 2x2 plot-matrix), I would like to have the y-ticks > shown on the right side such that the four plot panels are attached to each other/glued > together. How can I achieve this?There is no easy way. For the first step of a difficult way, see ?axis.default -Deepayan> I found a solution for a 2x1 matrix in the R-help archive, but this problem here is different. > > Cheers, > > Marius > > Ps: I guess the "scales=..." should somehow go inside the panel function, so that > the panel number tells the "alternating"-argument where it has to print the ticks. > > library(lattice) > x=rep(c(1,2,3),4) # x values > y=1:12 # y values > z=rep(1:4,each=3) # panel number > xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), > ? ? ? ?scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)), > ? ? ? ?panel=function(...){ > ? ? ? ? ? ? ? ?panel.xyplot(...,col=1) > > ? ? ? ?} > ) > ______________________________________________ > 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. >
Marius Hofert
2010-May-06 12:54 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
Thanks, Deepayan.
Is it at least possible to increase the space between the panels in the
following plot?:
library(lattice)
x=rep(c(1,2,3),4) # x values
y=1:12 # y values
z=rep(1:4,each=3) # panel number
xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
scales=list(relation="free",alternating=c(1,1),tck=c(1,0)),
panel=function(...){
panel.xyplot(...,col=1)
}
)
On 2010-05-06, at 13:53 , Deepayan Sarkar wrote:
> On Thu, May 6, 2010 at 12:16 PM, Marius Hofert <m_hofert at web.de>
wrote:
>> Dear R experts,
>>
>> I have four plots I would like to plot attached to each other (in
panels).
>> All plots have the same x-scale, but different y-scales. The example
below shows
>> pretty much what I would like to have, except that for the two plots in
the
>> "second column" (of this 2x2 plot-matrix), I would like to
have the y-ticks
>> shown on the right side such that the four plot panels are attached to
each other/glued
>> together. How can I achieve this?
>
> There is no easy way.
>
> For the first step of a difficult way, see ?axis.default
>
> -Deepayan
>
>
>> I found a solution for a 2x1 matrix in the R-help archive, but this
problem here is different.
>>
>> Cheers,
>>
>> Marius
>>
>> Ps: I guess the "scales=..." should somehow go inside the
panel function, so that
>> the panel number tells the "alternating"-argument where it
has to print the ticks.
>>
>> library(lattice)
>> x=rep(c(1,2,3),4) # x values
>> y=1:12 # y values
>> z=rep(1:4,each=3) # panel number
>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
>>
scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)),
>> panel=function(...){
>> panel.xyplot(...,col=1)
>>
>> }
>> )
>> ______________________________________________
>> 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.
>>
Deepayan Sarkar
2010-May-06 13:09 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
On Thu, May 6, 2010 at 6:24 PM, Marius Hofert <m_hofert at web.de> wrote:> Thanks, Deepayan. > > Is it at least possible to increase the space between the panels in the following plot?: > > library(lattice) > x=rep(c(1,2,3),4) # x values > y=1:12 # y values > z=rep(1:4,each=3) # panel number > xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), > ? ? ? scales=list(relation="free",alternating=c(1,1),tck=c(1,0)), > ? ? ? panel=function(...){ > ? ? ? ? ? ? ? panel.xyplot(...,col=1) > > ? ? ? } > )Sure, add par.settings = list(layout.widths = list(axis.panel = 2)) (similarly layout.heights for vertical gap). -Deepayan> > On 2010-05-06, at 13:53 , Deepayan Sarkar wrote: > >> On Thu, May 6, 2010 at 12:16 PM, Marius Hofert <m_hofert at web.de> wrote: >>> Dear R experts, >>> >>> I have four plots I would like to plot attached to each other (in panels). >>> All plots have the same x-scale, but different y-scales. The example below shows >>> pretty much what I would like to have, except that for the two plots in the >>> "second column" (of this 2x2 plot-matrix), I would like to have the y-ticks >>> shown on the right side such that the four plot panels are attached to each other/glued >>> together. How can I achieve this? >> >> There is no easy way. >> >> For the first step of a difficult way, see ?axis.default >> >> -Deepayan >> >> >>> I found a solution for a 2x1 matrix in the R-help archive, but this problem here is different. >>> >>> Cheers, >>> >>> Marius >>> >>> Ps: I guess the "scales=..." should somehow go inside the panel function, so that >>> the panel number tells the "alternating"-argument where it has to print the ticks. >>> >>> library(lattice) >>> x=rep(c(1,2,3),4) # x values >>> y=1:12 # y values >>> z=rep(1:4,each=3) # panel number >>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), >>> ? ? ? ?scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)), >>> ? ? ? ?panel=function(...){ >>> ? ? ? ? ? ? ? ?panel.xyplot(...,col=1) >>> >>> ? ? ? ?} >>> ) >>> ______________________________________________ >>> 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. >>> > >
Marius Hofert
2010-May-06 15:52 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
Dear Deepayan,
Thank you very much for your quick help.
I played a bit around and came up with two methods of plotting
a "matrix of plots" on a single page (see the code below). The first
you know
from my earlier postings. For this method I have the following questions:
1) Is it possible to have different x- and y-labels for each of the panels
(as in the second plot)?
2) Is it possible to rotate the y-axis ticks in each panel by -90 degrees
(as in the second plot)?
For the second method:
3) Is it possible reduce/control the space between the panels?
4) Is it possible to align the panels according to their "frame"? [the
panels of
the variables 2 and 4 are not properly aligned as the labels for the latter need
more space than the ones of the former.]
Many thanks,
Marius
library(lattice)
library(grid)
## panel function
library(lattice)
x=c(1,2,1,2,1,2,1,2)
y=c(1,2,2,1,1,-1,-2000,2000)
z=c(1,1,2,2,3,3,4,4) # panel number
xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
scales=list(relation="free",alternating=c(1,1),tck=c(1,0)),
par.settings = list(layout.widths = list(axis.panel = 2),
layout.heights = list(axis.panel = 2)),
panel=function(...){
panel.xyplot(...,col=1)
}
)
## grid idea
myplot <- function(x,y,z,xlab,ylab){
xyplot(y~x|z,type="l",aspect=1,
xlab=xlab,ylab=ylab,
strip = function(...) strip.default(...),
scales=list(alternating=c(1,1),tck=c(1,0))
)
}
grid.newpage()
pushViewport(viewport(layout=grid.layout(2,2)))
pushViewport(viewport(layout.pos.row=1,layout.pos.col=1))
print(myplot(1:2,1:2,"variable 1","x label","y
label"),newpage=FALSE)
popViewport(1)
pushViewport(viewport(layout.pos.row=1,layout.pos.col=2))
print(myplot(1:2,2:1,"variable 2","x label","y
label"),newpage=FALSE)
popViewport(1)
pushViewport(viewport(layout.pos.row=2,layout.pos.col=1))
print(myplot(1:2,c(1,-1),"variable 3","x label","y
label"),newpage=FALSE)
popViewport(1)
pushViewport(viewport(layout.pos.row=2,layout.pos.col=2))
print(myplot(1:2,c(-2000,2000),"variable 4","x
label","y label"),newpage=FALSE)
popViewport(1)
On 2010-05-06, at 15:09 , Deepayan Sarkar wrote:
> On Thu, May 6, 2010 at 6:24 PM, Marius Hofert <m_hofert at web.de>
wrote:
>> Thanks, Deepayan.
>>
>> Is it at least possible to increase the space between the panels in the
following plot?:
>>
>> library(lattice)
>> x=rep(c(1,2,3),4) # x values
>> y=1:12 # y values
>> z=rep(1:4,each=3) # panel number
>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
>>
scales=list(relation="free",alternating=c(1,1),tck=c(1,0)),
>> panel=function(...){
>> panel.xyplot(...,col=1)
>>
>> }
>> )
>
> Sure, add
>
> par.settings = list(layout.widths = list(axis.panel = 2))
>
> (similarly layout.heights for vertical gap).
>
> -Deepayan
>
>>
>> On 2010-05-06, at 13:53 , Deepayan Sarkar wrote:
>>
>>> On Thu, May 6, 2010 at 12:16 PM, Marius Hofert <m_hofert at
web.de> wrote:
>>>> Dear R experts,
>>>>
>>>> I have four plots I would like to plot attached to each other
(in panels).
>>>> All plots have the same x-scale, but different y-scales. The
example below shows
>>>> pretty much what I would like to have, except that for the two
plots in the
>>>> "second column" (of this 2x2 plot-matrix), I would
like to have the y-ticks
>>>> shown on the right side such that the four plot panels are
attached to each other/glued
>>>> together. How can I achieve this?
>>>
>>> There is no easy way.
>>>
>>> For the first step of a difficult way, see ?axis.default
>>>
>>> -Deepayan
>>>
>>>
>>>> I found a solution for a 2x1 matrix in the R-help archive, but
this problem here is different.
>>>>
>>>> Cheers,
>>>>
>>>> Marius
>>>>
>>>> Ps: I guess the "scales=..." should somehow go inside
the panel function, so that
>>>> the panel number tells the "alternating"-argument
where it has to print the ticks.
>>>>
>>>> library(lattice)
>>>> x=rep(c(1,2,3),4) # x values
>>>> y=1:12 # y values
>>>> z=rep(1:4,each=3) # panel number
>>>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2),
>>>>
scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)),
>>>> panel=function(...){
>>>> panel.xyplot(...,col=1)
>>>>
>>>> }
>>>> )
>>>> ______________________________________________
>>>> 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.
>>>>
>>
>>
Marius Hofert
2010-May-06 23:16 UTC
[R] trellis/lattice: How to plot 4 panels with the same x-scale but different y-scales?
> I played a bit around and came up with two methods of plotting > a "matrix of plots" on a single page (see the code below). The first you know > from my earlier postings. For this method I have the following questions: > 1) Is it possible to have different x- and y-labels for each of the panels > (as in the second plot)? > 2) Is it possible to rotate the y-axis ticks in each panel by -90 degrees > (as in the second plot)?okay, this one I could figure out: one may add "scales=list(y=list(rot=0))"> For the second method: > 3) Is it possible reduce/control the space between the panels? > 4) Is it possible to align the panels according to their "frame"? [the panels of > the variables 2 and 4 are not properly aligned as the labels for the latter need > more space than the ones of the former.] > > Many thanks, > > Marius > > > library(lattice) > library(grid) > > ## panel function > library(lattice) > x=c(1,2,1,2,1,2,1,2) > y=c(1,2,2,1,1,-1,-2000,2000) > z=c(1,1,2,2,3,3,4,4) # panel number > xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), > scales=list(relation="free",alternating=c(1,1),tck=c(1,0)), > par.settings = list(layout.widths = list(axis.panel = 2), > layout.heights = list(axis.panel = 2)), > panel=function(...){ > panel.xyplot(...,col=1) > } > ) > > ## grid idea > myplot <- function(x,y,z,xlab,ylab){ > xyplot(y~x|z,type="l",aspect=1, > xlab=xlab,ylab=ylab, > strip = function(...) strip.default(...), > scales=list(alternating=c(1,1),tck=c(1,0)) > ) > } > grid.newpage() > pushViewport(viewport(layout=grid.layout(2,2))) > pushViewport(viewport(layout.pos.row=1,layout.pos.col=1)) > print(myplot(1:2,1:2,"variable 1","x label","y label"),newpage=FALSE) > popViewport(1) > pushViewport(viewport(layout.pos.row=1,layout.pos.col=2)) > print(myplot(1:2,2:1,"variable 2","x label","y label"),newpage=FALSE) > popViewport(1) > pushViewport(viewport(layout.pos.row=2,layout.pos.col=1)) > print(myplot(1:2,c(1,-1),"variable 3","x label","y label"),newpage=FALSE) > popViewport(1) > pushViewport(viewport(layout.pos.row=2,layout.pos.col=2)) > print(myplot(1:2,c(-2000,2000),"variable 4","x label","y label"),newpage=FALSE) > popViewport(1) > > > > On 2010-05-06, at 15:09 , Deepayan Sarkar wrote: > >> On Thu, May 6, 2010 at 6:24 PM, Marius Hofert <m_hofert at web.de> wrote: >>> Thanks, Deepayan. >>> >>> Is it at least possible to increase the space between the panels in the following plot?: >>> >>> library(lattice) >>> x=rep(c(1,2,3),4) # x values >>> y=1:12 # y values >>> z=rep(1:4,each=3) # panel number >>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), >>> scales=list(relation="free",alternating=c(1,1),tck=c(1,0)), >>> panel=function(...){ >>> panel.xyplot(...,col=1) >>> >>> } >>> ) >> >> Sure, add >> >> par.settings = list(layout.widths = list(axis.panel = 2)) >> >> (similarly layout.heights for vertical gap). >> >> -Deepayan >> >>> >>> On 2010-05-06, at 13:53 , Deepayan Sarkar wrote: >>> >>>> On Thu, May 6, 2010 at 12:16 PM, Marius Hofert <m_hofert at web.de> wrote: >>>>> Dear R experts, >>>>> >>>>> I have four plots I would like to plot attached to each other (in panels). >>>>> All plots have the same x-scale, but different y-scales. The example below shows >>>>> pretty much what I would like to have, except that for the two plots in the >>>>> "second column" (of this 2x2 plot-matrix), I would like to have the y-ticks >>>>> shown on the right side such that the four plot panels are attached to each other/glued >>>>> together. How can I achieve this? >>>> >>>> There is no easy way. >>>> >>>> For the first step of a difficult way, see ?axis.default >>>> >>>> -Deepayan >>>> >>>> >>>>> I found a solution for a 2x1 matrix in the R-help archive, but this problem here is different. >>>>> >>>>> Cheers, >>>>> >>>>> Marius >>>>> >>>>> Ps: I guess the "scales=..." should somehow go inside the panel function, so that >>>>> the panel number tells the "alternating"-argument where it has to print the ticks. >>>>> >>>>> library(lattice) >>>>> x=rep(c(1,2,3),4) # x values >>>>> y=1:12 # y values >>>>> z=rep(1:4,each=3) # panel number >>>>> xyplot(y~x|z,type="l",aspect=1,layout=c(2,2), >>>>> scales=list(y=list(relation="free"),alternating=c(1,1),tck=c(1,0)), >>>>> panel=function(...){ >>>>> panel.xyplot(...,col=1) >>>>> >>>>> } >>>>> ) >>>>> ______________________________________________ >>>>> 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. >>>>> >>> >>> >