[R] lattice::xyplot/ggplot2: plotting weighted data frames with lmline and smooth

Michael Friendly friendly at yorku.ca
Fri Oct 21 20:57:34 CEST 2011


Thanks very much, Dennis.  See below for something I don't understand.

On 10/21/2011 12:15 PM, Dennis Murphy wrote:
> Hi Michael:
>
> Here's one way to get it from ggplot2. To avoid possible overplotting,
> I jittered the points horizontally by ± 0.2. I also reduced the point
> size from the default 2 and increased the line thickness to 1.5 for
> both fitted curves. In ggplot2, the term faceting is synonymous with
> conditioning (by groups).
>
> library('HistData')
> library('ggplot2')
> ggplot(PearsonLee, aes(x = parent, y = child)) +
>     geom_point(size = 1.5, position = position_jitter(width = 0.2)) +
>     geom_smooth(method = lm, aes(weights = PearsonLee$weight),
>                 colour = 'green', se = FALSE, size = 1.5) +
>     geom_smooth(aes(weights = PearsonLee$weight),
>                 colour = 'red', se = FALSE, size = 1.5) +
>     facet_grid(chl ~ par)
This seems to work, but I don't understand *why*, since the weight 
variable is
PearsonLee$frequency, not PearsonLee$weight.

 > PearsonLee$weight
NULL

I get an error if I try to use PearsonLee$frequency as the weights= 
variable.

 > ggplot(PearsonLee, aes(x = parent, y = child)) +
+    geom_point(size = 1.5, position = position_jitter(width = 0.2)) +
+    geom_smooth(method = lm, aes(weights = PearsonLee$frequency),
+                colour = 'green', se = FALSE, size = 1.5) +
+    geom_smooth(aes(weights = PearsonLee$frequency),
+                colour = 'red', se = FALSE, size = 1.5) +
+    facet_grid(chl ~ par)
Error in eval(expr, envir, enclos) : object 'weight' not found

In the form below, it makes sense to me and does work, using 
weight=frequency in the initial aes(),
and weight= in geom_smooth:

ggplot(PearsonLee, aes(x = parent, y = child, weight=frequency)) +
    geom_point(size = 1.5, position = position_jitter(width = 0.2)) +
    geom_smooth(method = lm, aes(weight = PearsonLee$frequency),
                colour = 'green', se = FALSE, size = 1.5) +
    geom_smooth(aes(weight = PearsonLee$frequency),
                colour = 'red', se = FALSE, size = 1.5) +
    facet_grid(chl ~ par)


> # If you prefer a legend, here's one take, pulling the legend inside
> # to the upper left corner. This requires a bit more 'trickery', but
> # the tricks are found in the ggplot2 book.
>
> ggplot(PearsonLee, aes(x = parent, y = child)) +
>     geom_point(size = 1.5, position = position_jitter(width = 0.2)) +
>     geom_smooth(method = lm, aes(weights = PearsonLee$weight,
>                 colour = 'Linear'), se = FALSE, size = 1.5) +
>     geom_smooth(aes(weights = PearsonLee$weight,
>                 colour = 'Loess'), se = FALSE, size = 1.5) +
>     facet_grid(chl ~ par) +
>     scale_colour_manual(breaks = c('Linear', 'Loess'),
>                         values = c('green', 'red')) +
>     opts(legend.position = c(0.14, 0.885),
>          legend.background = theme_rect(fill = 'white'))
>
>
> HTH,
> Dennis


-- 
Michael Friendly     Email: friendly AT yorku DOT ca
Professor, Psychology Dept.
York University      Voice: 416 736-5115 x66249 Fax: 416 736-5814
4700 Keele Street    Web:   http://www.datavis.ca
Toronto, ONT  M3J 1P3 CANADA



More information about the R-help mailing list