[R] Help: Side-by-side named barplot bars

hadley wickham h.wickham at gmail.com
Thu Oct 18 20:31:13 CEST 2007

On 10/18/07, Jim Lemon <jim at bitwrit.com.au> wrote:
> Sergey Goriatchev wrote:
> > Hello,
> >
> > Let me describe what I have and what I want to do:
> >
> > I have two (7x6) matrices (call them A and B) that have same row and
> > column names (rows=species, columns=variables) but contain numerical
> > values that differ (same experiment done twice and values calculated
> > and put in different matrices).
> > ...
> > But this is not very effective. What I want to do is to combine the
> > two similar barplots for each experiment into one. So, for each
> > species I create just one barplot where I plot 6 clusters each
> > consisting of 2 bars, one bar for same varibale but different
> > experiment. I want to put the values as text at the top of each bar
> > and below each cluster I want to put the name of the variable (they
> > are the same for each experiment, remember).
> >
> Hi Sergey,
> See if this does what you want:
> library(plotrix)
> mat1<-matrix(rnorm(42,3),nrow=7)
> mat2<-matrix(rnorm(42,3),nrow=7)
> colnames(mat1)<-colnames(mat2)<-
>   c("First","Second","Third","Fourth","Fifth","Sixth")
> rownames(mat1)<-rownames(mat2)<-
>   c("Fextus decrepitans","Gryphon laxus",
>   "Domus flaccidus","Cogitans prostrata","Osmia putrescens",
>   "Aria excruciata","Pestis ubiquitus")

I'm a strong believer in always storing data in data.frames, so the
first thing I'd do with your data is put it in that form.  This also
has the nice side effect of making the data self-documenting.  I'd
process Jim's example data as follows:


df1 <- melt(mat1)
df2 <- melt(mat2)

names(df1) <- names(df2) <- c("species", "variable", "value")
df1$expt <- "one"
df2$expt <- "two"

df <- rbind(df1, df2)

It's then easy to plot the data with lattice or ggplot2.  The examples
below use ggplot2.


qplot(variable, value, data=df, geom="bar", stat="identity",
fill=expt, position="dodge", facets = . ~ species)

Another option would be to use a dot plot instead - this has a much
higher data-ink ratio, and is arguably more correct when the values
don't represent sums.

qplot(variable, value, data=df, colour=expt, facets = . ~ species)

You could also connect the two experiments with a line:

qplot(variable, value, data=df, colour=expt, facets = . ~ species) +
geom_line(aes(group=variable), colour="grey")

If you really want the labels (and I wouldn't recommend it - it's a
graph not a table), you can add the following line to either of the
above calls:

+ geom_text(aes(label = formatC(value, digits=2), vjust = 0))

If you want the axes flipped (so it's easier to read the text labels), add:

+ coord_flip()




More information about the R-help mailing list