[R] Stacked barplot with two stacked bars besides each other

hadley wickham h.wickham at gmail.com
Tue Jan 20 14:35:57 CET 2009


On Tue, Jan 20, 2009 at 4:28 AM, Daniel Brewer <daniel.brewer at icr.ac.uk> wrote:
> Hi,
>
> I have a particular barplot I would like to generate, but I am having
> trouble getting it to work.  What I would like is in effect two barplots
>  with stacked bars merged into one.  For example,  I have two samples
> (yoda1,yoda2) on which I measure whether two variables (var1,var2) are
> present or absent for a number of measurements on that sample.
>
>> var1 <- data.frame(yoda1=c(3,7), yoda2=c(1,9))
>> var2 <- data.frame(yoda1=c(8,2), yoda2=c(5,5))

I'd start by storing your data in a single data frame, with all
information explicit:

var1$row <- 1:2
var1$var <- "one"
var2$row <- 1:2
var2$var <- "two"

vars <- rbind(var1, var2)

library(reshape)
df <- melt(vars, id = c("var", "row"))
names(df)[3] <- "yoda"
df

(In reality you'd give the variables informative names based on your
study design)

Then you're in a position to better describe and control what you
want.  With the data in this form, you could then use the ggplot2
package to display it:

library(ggplot2)
qplot(yoda, value, data = df, fill = factor(row), geom="bar", stat =
"identity", facets = ~ var)

This puts yoda on the x axis, colours the bars by the row and
separates the plot into two panels based on var.  It's trivial to
produce any other arrangement of the three variables.

qplot(var, value, data = df, fill = factor(row), geom="bar", stat =
"identity", facets = ~ yoda)
qplot(row, value, data = df, fill = yoda, geom="bar", stat =
"identity", facets = ~ var)
etc

Hadley

-- 
http://had.co.nz/




More information about the R-help mailing list