[R] combination xyplot and barchart?

Erin Berryman berr0179 at umn.edu
Wed Nov 16 18:18:11 CET 2005


Thank you, that worked great. Per your suggestion, I transformed the 
Precip data to fit on the same scale as the Temp data. After changing 
trellis.par.set$layout.widths$right.padding to 5, I was able to fit a 
second axis and label for the Precip (using panel.axis) to achieve the 
plot I want.

Erin

On Nov 15, 2005, at 9:09 PM, Deepayan Sarkar wrote:

> On 11/15/05, Erin Berryman <berr0179 at umn.edu> wrote:
>> Dear R community,
>>
>> I am having trouble determining how to create the graph I want
>> utilizing my relatively limited knowledge of R. So far I have been
>> using the lattice library to create most of what I need.
>> The dataset (enviro) consists of 2 variables (Temp and Precip) for 
>> each
>> Day of a 2-yr period (Year). I wish to display Temp and Precip along
>> the y axis plotted by Day on the x axis to allow comparison (one 
>> year's
>> data in each of 2 panels stacked on top of each other) between the
>> years. Essentially what I want it to look like is an xyplot (Temp ~ 
>> Day
>> | Year, type='l') superimposed onto a barchart(Precip ~ Day | Year,
>> horizontal=F), with scales adjusted so one can see detail in both
>> variables.
>> The closest I have come to what I need is by the following code :
>>
>> library(lattice)
>> barchart(Precip + Temp ~ Day | Year, data=enviro, layout=c(1,2),
>> horizontal=F, origin=0,
>> panel=function(x,y,subscripts,...){panel.xyplot(x=enviro$Day,
>> y=enviro$Temp, type='l',subscripts=subscripts, ...);
>> panel.barchart(x=enviro$Day, y=enviro$Precip, subscripts=subscripts,
>> ...)})
>>
>> Two panels are produced; however, both years' data are plotted in each
>> panel (panels look identical). And I get this error:
>>
>> Error in grid.Call.graphics("L_rect", x$x, x$y, x$width, x$height,
>> resolveHJust(x$just,  :
>> 	invalid line type
>
> A reproducible example, even if it's a toy one, would have been 
> helpful.
>
> Your usage is confused. In particular, panel.xyplot ignores the
> subscripts argument, so you end up giving exactly the same set of
> values to panel.xyplot for both panels (so it's not surprising that
> your panels show the same data). It seems that you are looking for
> something like the following:
>
>
> enviro <-
>     data.frame(Year = rep(2001:2002, each = 365),
>                Day = rep(1:365, 2),
>                Precip = pmax(0, rnorm(365 * 2)),
>                Temp = 2 + 0.2 * rnorm(365 * 2))
>
>
> xyplot(Precip + Temp ~ Day | Year, data=enviro,
>        layout = c(1, 2),
>        panel = panel.superpose.2,
>        type = c('h', 'l'))
>
> In case it helps, this is shorthand for
>
> xyplot(Precip + Temp ~ Day | Year, data=enviro,
>        layout = c(1, 2),
>        panel = function(x, y, groups, subscripts, ...) {
>            panel.superpose.2(x = x, y = y,
>                              groups = groups,
>                              subscripts = subscripts,
>                              ...)
>        },
>        type = c('h', 'l'))
>
> Note that the panel function is defined in terms of arguments it gets,
> and does not explicitly refer to any external variables (like the data
> frame 'enviro'). If you find yourself writing code that does, it's a
> likely sign that you are doing something wrong (or at least
> unnecessarily convoluted).
>
>
>>  From the documentation or the help archives, I cannot understand how 
>> to:
>> 1) indicate a conditioning variable (Year) for panel.barchart and
>> panel.xyplot
>> 2) have 2 y axes with different scales in one panel
>
> You can't easily. A panel has one set of scales, and that's it. You
> can of course fake it by transforming the relevant part of your data
> and adding a set of tick marks with appropriate (fake) labels (see
> ?panel.axis).
>
> -Deepayan
>




More information about the R-help mailing list