[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