[R] lattice barchart with "negative" bars
Luis Torgo
ltorgo at liacc.up.pt
Tue Dec 10 18:54:02 CET 2002
On Tuesday 10 December 2002 14:30, Deepayan Sarkar wrote:
> No, I don't think so (short of using a modified panel.barchart, which
> should be relatively easy -- panel.barchart essentially has just 3 lines of
> code). But this seems very reasonable thing to want, so I'll add an option
> for this.
>
> You could also use xyplot with type = "h", but that will give you lines
> instead of bars.
>
Thank you for your help. You are right it is easy to adapt panel.barchart to
perform what I wanted. As such, while you do not add an option for that, I've
took the liberty to create my version of panel.barchart to solve the problem
temporarily. I herein include it together with a simple example use, in case
somebody has the same problem as me.
The function works almost fine. The only problem I was not able to get around
is the zero value reference line I want to draw in the case of horizontal
bars. I've used the grid.lines function. It works fine for vertical bars, but
it doesn't work for horizontal bars...
Luis Torgo
# Adapted from the code of panel.barchart by Deepayan Sarkar
my.panel.barchart <- function (x, y, box.ratio = 1, horizontal = TRUE, col =
bar.fill$col,
...)
{
x <- as.numeric(x)
y <- as.numeric(y)
bar.fill <- trellis.par.get("bar.fill")
if (horizontal) {
height <- box.ratio/(1 + box.ratio)
grid.lines(x=0,y=unit(c(0,1),"npc"),default.units="native")
for (i in seq(along = x))
if (x[i] >= 0)
grid.rect(gp = gpar(fill = col), y = y[i], x = 0,
height = height, width = y[i] - 0,
just = c("left", "centre"), default.units = "native")
else
grid.rect(gp = gpar(fill = col), y = y[i], x = x[i],
height = height, width = 0 - x[i],
just = c("left", "centre"), default.units = "native")
}
else {
width <- box.ratio/(1 + box.ratio)
grid.lines(x=unit(c(0,1),"npc"),y=0,default.units="native")
for (i in seq(along = y))
if (y[i] >= 0)
grid.rect(gp = gpar(fill = col), x = x[i], y = 0,
height = y[i] - 0, width = width,
just = c("centre", "bottom"), default.units = "native")
else
grid.rect(gp = gpar(fill = col), x = x[i], y = y[i],
height = 0 - y[i], width = width,
just = c("centre", "bottom"), default.units = "native")
}
}
# Example using the function
my.data <-
data.frame(var=c(34,-10,25,-40),season=c('s','w','s','w'),site=c('A','A','B','B'))
barchart(var ~ season | site, data=my.data, panel="my.panel.barchart")
--
Luis Torgo
FEP/LIACC, University of Porto Phone : (+351) 22 607 88 30
Machine Learning Group Fax : (+351) 22 600 36 54
R. Campo Alegre, 823 email : ltorgo at liacc.up.pt
4150 PORTO - PORTUGAL WWW : http://www.liacc.up.pt/~ltorgo
More information about the R-help
mailing list