[R] error bars in lattice xyplot *with groups*
Deepayan Sarkar
deepayan.sarkar at gmail.com
Tue Jun 6 09:31:00 CEST 2006
On 6/5/06, Mike Lawrence <Mike.Lawrence at dal.ca> wrote:
> Hi all,
>
> I'm trying to plot error bars in a lattice plot generated with xyplot. Deepayan
> Sarkar has provided a very useful solution for simple circumstances
> (https://stat.ethz.ch/pipermail/r-help/2005-October/081571.html), yet I am
> having trouble getting it to work when the "groups" setting is enabled in
> xyplot (i.e. multiple lines). To illustrate this, consider the singer data
> generated by the above linked solution previously submitted:
>
> #####################
> library(lattice)
> singer.split <-
> with(singer,
> split(height, voice.part))
>
> singer.ucl <-
> sapply(singer.split,
> function(x) {
> st <- boxplot.stats(x)
> c(st$stats[3], st$conf)
> })
>
> singer.ucl <- as.data.frame(t(singer.ucl))
> names(singer.ucl) <- c("median", "lower", "upper")
> singer.ucl$voice.part <-
> factor(rownames(singer.ucl),
> levels = rownames(singer.ucl))
>
> #now let's split up the voice.part factor into two factors,
> singer.ucl$voice=factor(rep(c(1,2),4))
> singer.ucl$range=factor(rep(c("Bass","Tenor","Alto","Soprano"),each=2))
>
> #here's Deepayan's previous solution, slightly modified to depict
> # the dependent variable (median) and the error bars on the y-axis
> # and the independent variable (voice.part) on the x-axis
> prepanel.ci <- function(x, y, ly, uy, subscripts, ...)
> {
> x <- as.numeric(x)
> ly <- as.numeric(ly[subscripts])
> uy <- as.numeric(uy[subscripts])
> list(ylim = range(y, uy, ly, finite = TRUE))
> }
> panel.ci <- function(x, y, ly, uy, subscripts, pch = 16, ...)
> {
> x <- as.numeric(x)
> y <- as.numeric(y)
> ly <- as.numeric(ly[subscripts])
> uy <- as.numeric(uy[subscripts])
> panel.arrows(x, ly, x, uy, col = "black",
> length = 0.25, unit = "native",
> angle = 90, code = 3)
> panel.xyplot(x, y, pch = pch, ...)
> }
>
>
> #this graph works
> xyplot(median ~ voice.part,
> data=singer.ucl,
> ly = singer.ucl$lower,
> uy = singer.ucl$upper,
> prepanel = prepanel.ci,
> panel = panel.ci,
> type="b"
> )
>
> #this one does not (it will plot, but will not seperate the groups)
> xyplot(median ~ voice,
> groups=range,
> data=singer.ucl,
> ly = singer.ucl$lower,
> uy = singer.ucl$upper,
> prepanel = prepanel.ci,
> panel = panel.ci,
> type="b"
> )
>
> ####################################
>
> Any suggestions?
Use a panel function that knows about groups, e.g.
xyplot(median ~ voice,
groups=range,
data=singer.ucl,
ly = singer.ucl$lower,
uy = singer.ucl$upper,
prepanel = prepanel.ci,
panel = panel.superpose,
panel.groups = panel.ci,
type="b")
If you prefer colored bars, change panel.ci to
panel.ci <- function(x, y, ly, uy, subscripts, pch = 16, col.line =
'black', ...)
{
x <- as.numeric(x)
y <- as.numeric(y)
ly <- as.numeric(ly[subscripts])
uy <- as.numeric(uy[subscripts])
panel.arrows(x, ly, x, uy, col = col.line,
length = 0.25, unit = "native",
angle = 90, code = 3)
panel.xyplot(x, y, pch = pch, col.line = col.line, ...)
}
Deepayan
More information about the R-help
mailing list