Grouped and stacked tablet using R base

I would like to create a combination combination chart in which inside data1 and data2 are stacked together, and between data1 and data2 are grouped in the base schedule R.

Something like this in the layout:

enter image description here

data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5) data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5) # stacked bar barplot(data1) #grouped var barplot(data1, beside=TRUE) 

Any idea how I can do this? I know that we can do this using different plots or faces, but I would like to present them side by side in one plot.

+6
source share
5 answers

You can use the space argument from barplot to shift the second barplot :

 # plot first barplot, using xlim to ensure there is enough space to plot the second one # (here the spaces are all 0, so the bars are grouped together) barplot(data1, space=0, xlim=c(-1, ncol(data1)+ncol(data2)+1), las=1) # plot second barplot (with add=TRUE so the bars appear on the same plot), # putting a space of 6 (the number of columns of data1 + 1) at the beginning, # to plot the "new" bars on the right of the first bars (the other spaces are 0): barplot(data2, space=c(ncol(data1)+1, rep(0, ncol(data2)-1)), las=1, add=TRUE) 

enter image description here

+3
source

You can try using mfrow to build two stories side by side:

 par(mfrow = c(1,2)) barplot(data1, ylim = c(0,13), xlab = "data1") barplot(data2, ylim = c(0,13), axes = FALSE, xlab = "data2") 

enter image description here

+4
source

I know that you are looking for a base-R solution. This is pitty. ggplot2 offers great opportunities for performing such tasks:

 data3 = data.frame(data_nr = rep(c("data1","data2"), each=15), cat_1 = rep(rep(letters[1:5], each=3),2), cat_2 = rep(rep(LETTERS[1:3], 5),2), height = c(1:5, rep(1,5), rep(4,5), 2:6, rep(2,5), rep(3,5))) ggplot(data3, aes(x=cat_1, y=height, fill=cat_2)) + geom_bar(stat="identity", position="stack") + facet_grid(~ data_nr) 

gives: enter image description here

I can think of a (less elegant) solution in pure base-R using a little hack:

 data12 = cbind(data1, rep(NA,3), data2) barplot(data12, space=0) 

gives: enter image description here

+1
source

Here is a user-defined function where you can manipulate between group graphs and within them and can be executed with any amount of data that you want to build.

 multistack.bar <- function(x=list(x), betweenspace = 2, withinspace=0, ...){ # note that number of rows in each component matrix of the list # should be equal # if you have missing value use "NA", to make it complete # number of column can differ mylist <- x space = list() space[[1]] <- c(rep(withinspace,ncol(mylist[[1]] )),betweenspace ) for ( i in 2:length(mylist)){ if(i == length(mylist)){ space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1)) } else{ space[[i]] <- c(rep(withinspace,ncol(mylist[[i]] )-1),betweenspace ) } } un.space <- c(unlist(space)) newdata <- do.call("cbind", mylist) barplot(newdata, space= un.space, ...) } 

Below is an example with three datasets. Note that all data has the same number of rows, but the column is different. Since the row values โ€‹โ€‹are stacked, there must be the same number, but you can make equal rows by setting NA or 0 for the missing group.

 data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5) data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5) data3 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5) data4 <- matrix(c(1:4, rep(1,4), rep(4,4)), ncol=4) mylist <- list(data1, data2, data3, data4) multistack.bar(mylist, betweenspace=3, withinspace=0.1, col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency", ylim = c(0, 16)) # you can decrease space between bars to 0 no space and between plots multistack.bar(mylist, betweenspace=1, withinspace=0, col = c("pink", "blue", "purple"), xlab="groups", ylab="frequency", ylim = c(0, 16)) # now you can use any thing you want just make it elegant or useful. legend(8, 14.8, c("A", "B", "C"), fill = c("pink", "blue", "purple"), ncol=3 ) abline(h=4, lty =2, col= "red") 

enter image description here

+1
source
 library(gridExtra) data1 <- matrix(c(1:5, rep(1,5), rep(4,5)), ncol=5) data2 <- matrix(c(2:6, rep(2,5), rep(3,5)), ncol=5) # stacked bar plot1 <- barplot(data1) #grouped var plot2<- barplot(data1, beside=TRUE) grid.arrange(plot1, plot2, ncol=2) 
-2
source

All Articles