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. Muhammad Subianto
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
On 12/1/06, Marc Schwartz <marc_schwartz at comcast.net> wrote:> 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: > > [snipped]And here is a lattice alternative: dflist <- list() for (nm in c("satu", "dua", "tiga", "empat")) { dflist[[nm]] <- as.data.frame.table(get(nm)) } cdf <- do.call(make.groups, dflist) barchart(Freq ~ which | Var2, data = cdf, groups = Var1, stack = FALSE, origin = 0, layout = c(4, 1), auto.key = TRUE) barchart(which ~ Freq | Var2, data = cdf, groups = Var1, stack = TRUE, auto.key = TRUE) -Deepayan
Dear; Marc Schwartz and Deepayan Sarkar, Thank you both very much for the suggestions! These are exactly what I was looking for. Best wishes, Muhammad Subianto On this day 12/01/2006 09:09 PM, Deepayan Sarkar wrote:> On 12/1/06, Marc Schwartz <marc_schwartz at comcast.net> wrote: >> 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: >> >> [snipped] > > And here is a lattice alternative: > > > dflist <- list() > for (nm in c("satu", "dua", "tiga", "empat")) > { > dflist[[nm]] <- as.data.frame.table(get(nm)) > } > > cdf <- do.call(make.groups, dflist) > > barchart(Freq ~ which | Var2, data = cdf, > groups = Var1, stack = FALSE, origin = 0, > layout = c(4, 1), auto.key = TRUE) > > barchart(which ~ Freq | Var2, data = cdf, > groups = Var1, stack = TRUE, > auto.key = TRUE) > > > -Deepayan >