Grouping the Bars on a Bar Plot with R
You’ve probably seen bar plots where each point on the x-axis has more than one bar. The image below shows an example. The bar plot shows the frequency of eye color for four hair colors in 313 female students. The data is from the
HairEyeColor data set. This type of plot is called a grouped bar plot.
How does the base R graphics package deal with that? You begin by isolating the female data in the
HairEyeColor data set, which lives in the
> library(datasets) > females <- HairEyeColor[,,2] > females Eye Hair Brown Blue Hazel Green Black 36 9 5 2 Brown 66 34 29 14 Red 16 7 7 7 Blond 4 64 5 8
To begin producing the image above, you have to specify the colors in the bars and in the legend:
> color.names = c("black","grey40","grey80","white")
A word about those names: You can combine
grey with any number from 0 to 100 to create a color —
“grey0” is equivalent to
“grey100” is equivalent to
Now you turn once again to the
barplot() function. Interestingly, if you use
females as the first argument for
barplot(), R draws a plot with Eye Color on the x-axis (rather than Hair Color). To reverse that, you use
t() to interchange (transpose, in other words) the rows and columns:
> t(females) Hair Eye Black Brown Red Blond Brown 36 66 16 4 Blue 9 34 7 64 Hazel 5 29 7 5 Green 2 14 7 8
The function that produces the bar plot is
> barplot(t(females),beside=T,ylim=c(0,70),xlab="Hair Color",ylab="Frequency of Eye Color", col=color.names,axis.lty="solid")
beside=T tells R to plot the bars, well, beside each other. (Try it without this argument and watch what happens.)
ylim insures that no bar will rise above the highest value on the y-axis.
col=color.names supplies the colors named in the vector.
The plot isn’t complete without the legend (the box that tells you which plot colors correspond to which eye colors):
> legend("top",rownames(t(females)),cex =0.8,fill=color.names,title="Eye Color")
The first argument puts the legend at the top of the plot, and the second argument provides the names. The third argument specifies the size of the characters in the legend — .08 means “80% of the normal size.” The fourth argument gives the colors for the color swatches, and the fifth, of course, provides the title.