Make many barplot into one plot
On Fri, 2006-12-01 at 18:02 +0100, Muhammad Subianto wrote:
Dear all,
## I have 4 tables like this:
satu <- array(c(5,15,20,68,29,54,84,119), dim=c(2,4),
dimnames=list(c("Negative", "Positive"), c("Black",
"Brown", "Red", "Blond")))
dua <- array(c(50,105,30,8,29,25,84,9), dim=c(2,4),
dimnames=list(c("Negative", "Positive"), c("Black",
"Brown", "Red", "Blond")))
tiga <- array(c(9,16,26,68,12,4,84,12), dim=c(2,4),
dimnames=list(c("Negative", "Positive"), c("Black",
"Brown", "Red", "Blond")))
empat <- array(c(25,13,50,78,19,34,84,101), dim=c(2,4),
dimnames=list(c("Negative", "Positive"), c("Black",
"Brown", "Red", "Blond")))
## with barplot I can make a plot for each table:
barplot(satu, beside=TRUE, legend.text=rownames(satu),
ylim = c(0, max(colSums(satu)) * 1.2))
x11()
barplot(dua, beside=TRUE, legend.text=rownames(dua),
ylim = c(0, max(colSums(dua)) * 1.2))
x11()
barplot(tiga, beside=TRUE, legend.text=rownames(tiga),
ylim = c(0, max(colSums(tiga)) * 1.2))
x11()
barplot(empat, beside=TRUE, legend.text=rownames(empat),
ylim = c(0, max(colSums(empat)) * 1.2))
## I can make all barplot above into one plot with
x11(width=11,height=8)
## Make a plot with 2 rows and 2 columns
oldpar <- par(mfrow=c(2,2),
barplot(above)
par(oldpar)
## Are there any functions to make all barplot above into one plot?
## I would like to produce barplot like:
| | | |
| | | | | | | | | | | | | |
|pos|neg|pos|neg|pos|neg|pos|neg| |pos|neg|pos|neg| ...
| | | | | | | | | | | | | |
--------------------------------- --------------------
satu dua tiga empat satu dua ...
black blond
I would be grateful if anybody could help me.
Thank you very much.
I would encourage you to look at the barchart() function in the lattice
package, which in many ways is better suited to doing multi-dimensional
plots.
That being said:
# rbind() the tables together
TAB <- rbind(satu, dua, tiga, empat)
# Do the barplot and save the bar midpoints
mp <- barplot(TAB, beside = TRUE,
axisnames = FALSE)
# Add the individual bar labels
mtext(1, at = mp, text = c("N", "P"),
line = 0, cex = 0.5)
# Get the midpoints of each sequential pair of bars
# within each of the four groups
at <- t(sapply(seq(1, nrow(TAB), by = 2),
function(x) colMeans(mp[c(x, x+1), ])))
# Add the group labels for each pair
mtext(1, at = at,
text = rep(c("satu", "dua", "tiga", "empat"), 4),
line = 1, cex = 0.75)
# Add the color labels for each group
mtext(1, at = colMeans(mp),
text = c("Black", "Brown", "Red", "Blond"),
line = 2)
Take a look at ?barplot and note that the function returns the bar
midpoints, which in this case is a matrix:
mp
[,1] [,2] [,3] [,4] [1,] 1.5 10.5 19.5 28.5 [2,] 2.5 11.5 20.5 29.5 [3,] 3.5 12.5 21.5 30.5 [4,] 4.5 13.5 22.5 31.5 [5,] 5.5 14.5 23.5 32.5 [6,] 6.5 15.5 24.5 33.5 [7,] 7.5 16.5 25.5 34.5 [8,] 8.5 17.5 26.5 35.5 Then look at ?mtext for the labelling. HTH, Marc Schwartz