Making a barplot the 'standard' way
dat <- read.table(text = "A B
+ 1 1 4
+ 2 2 3
+ 3 3 2
+ 4 4 1", header = TRUE)
barplot(as.matrix(dat))
gives a barplot like this:
Instead, I would like to have the different segnments to overlap, like so
How can I make such a plot in R?
There are two ways I have used:
library('ggplot2')
counts <- with(diamonds, table(cut, clarity))
# clarity
# cut I1 SI2 SI1 VS2 VS1 VVS2 VVS1 IF
# Fair 210 466 408 261 170 69 17 9
# Good 96 1081 1560 978 648 286 186 71
# Very Good 84 2100 3240 2591 1775 1235 789 268
# Premium 205 2949 3575 3357 1989 870 616 230
# Ideal 146 2598 4282 5071 3589 2606 2047 1212
It is painfully easy in ggplot
ggplot(diamonds, aes(clarity, fill = cut)) +
geom_bar(position = 'identity', alpha = 0.3)
In base R
cols <- ggcols(nrow(counts))
for (ii in 1:nrow(counts))
barplot(counts[ii, ], add = ii != 1, ylim = c(0, 5000),
col = adjustcolor(cols[ii], 0.3),
axes = FALSE, axisnames = FALSE, border = NA)
axis(1, barplot(counts, plot = FALSE), colnames(counts))
axis(2, las = 1)
title(main = 'identity')
box(bty = 'l')
legend('topright', bty = 'n', title = 'cut',
legend = rownames(counts), fill = adjustcolor(cols, 0.5))
And to match the ggplot colors:
ggcols <- function (n, l = 65, c = 100) {
hues <- seq(15, 375, length = n + 1)
hcl(h = hues, l = l, c = c)[1:n]
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With