Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a grouped bar plot in R

Tags:

plot

r

bar-chart

I have a data frame df in R, that looks like this:

        D     C     B     E     K     R
Rd      80    80    80    80    80    80
Sw      100   100   100   100   100   100
Sf      100   100   100   100   100   100

I'm trying to plot the data in a bar plot. I need the y axis to have the range 0-100, and the x axis to be the category names. Basically, I need it to look like this:

100 |               _ _ _ _ _ _    _ _ _ _ _ _
    |_ _ _ _ _ _   | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
    | | | | | | |  | | | | | | |  | | | | | | |
 0  |_|_|_|_|_|_|__|_|_|_|_|_|_|__|_|_|_|_|_|_|_
     D C B E K R    D C B E K R    D C B E K R
         Rd             Sw            Sf

With all of the Ds the same color, all of the Cs the same colour, and so on.

I'm not sure how to do this, or which libraries to use.

So far I have:

counts <- as.matrix(df$D, df$C, df$B, df$E, df$K, df$R)

barplot(counts, beside = TRUE, space = c(0, 0, 0, 0, 0, 0), xlab = "",
col = c("coral", "coral1", "coral2", "coral3", "coral4", "cornflowerblue"),
    names.arg = c("D", "C", "B", "E", "K", "R"))
mtext(side = 1, text = "x label", line = 7)

But it only displays something like this:

100 |  _ _   _ _
    |_| | |_| | |
    | | | | | | |
    | | | | | | |
    | | | | | | |
 0  |_|_|_|_|_|_|_
     D C B E K R
       x label

I'm not sure why I'm getting only this.

Any help would be much appreciated.

like image 606
LoneWolf Avatar asked Feb 14 '23 04:02

LoneWolf


1 Answers

Try this:

df2 <- t(as.matrix(df))
bp <- barplot(df2,beside=TRUE,col=1:6)
mtext(rownames(df2),1,at=bp)

enter image description here

If you would like to edit things to spin axis labels or exactly position the group/bar labels, then you can do something like the below code. Change the line= arguments to affect the vertical position of the labels and the las=1 argument on the barplot call to spin the labels as required.

df2 <- t(as.matrix(df))
bp <- barplot(df2,beside=TRUE,col=1:6,axisnames=FALSE,las=1)
mtext(rownames(df2),1,at=bp,line=0.6)
mtext(colnames(df2),1,at=colMeans(bp),line=2)
like image 77
thelatemail Avatar answered Feb 17 '23 09:02

thelatemail