[R] xyplot and lsegments

Deepayan Sarkar deepayan.sarkar at gmail.com
Fri Feb 8 18:46:15 CET 2008


On 2/8/08, Alex Brown <fishtank at compsoc.man.ac.uk> wrote:
> Hi,
>
>         How might I use xyplot to plot segments where the segments are in the
> input data? (ie a directed acyclic forest).
>
>         Here's an example in base graphics:
>
> n = data.frame(id = c(1,2,3,4), parent = c(0,1,2,2), value =
> c(5,5.5,7,3), date = c(1,2,3,3.5))
>
> plot(n$date, n$value)
>
> do.call(
>   segments,
>   with(
>     merge(n,n,by.x="parent", by.y="id"),
>     data.frame(x0=date.x, y0=value.x, x1=date.y, y1=value.y)
>   )
> )
>
>         xyplot only seems to take an x and a y, and panels only seem to get x
> and y.
>
>         I can see an lsegments, but I can't see how to use it in this example.

The direct translation would be

xyplot(value ~ date, data = n,
       data.lines = merge(n,n,by.x="parent", by.y="id"),
       panel = function(x, y, data.lines, ...) {
           panel.xyplot(x, y, ...)
           with(data.lines,
                lsegments(x0=date.x, y0=value.x,
                          x1=date.y, y1=value.y))
       })

(lsegments seems unable to work with a list currently, so that part is
slightly different.)

Things would be a bit more interesting if you had a multipanel plot,
in which case you would need a more general solution involving
subscripts.

-Deepayan



More information about the R-help mailing list