彼此堆叠的条形图

Stacked barplot beside each other

我正在尝试构建一个彼此相邻的堆叠条形图,但我唯一能够生成的是两个分离的堆叠条形图。这是一个示例数据

par(mfrow=c(1,2))

i<-c(49.36,42.61,40.14,41.33)
ls<-c(49.27,47.4,57.39,56.02)
us<-c(1.37,9.99,2.48,2.65)
dat<-as.matrix(rbind(i,ls,us))
colnames(dat)<-colnames(dat, do.NULL = FALSE, prefix = c("bc","hd","he","mi"))
barplot(dat,col=c("green4","Orange","orangered4"),names.arg = c("BC","HD","HE","MI"))

i<-c(55.76,56.96,52.09,41.76)
ls<-c(39.03,40.05,45.77,50.04)
us<-c(5.21,2.99,2.13,8.20)
dat1<-as.matrix(rbind(i,ls,us))
colnames(dat1)<-colnames(dat1, do.NULL = FALSE, prefix = c("bc","hd","he","mi"))
barplot(dat1,col=c("green4","Orange","orangered4"),names.arg = c("BC","HD","HE","MI"))

这是结果图:

我想做的是将这两个图组合成一个图,使 BC 和 BC1 彼此相邻,HD 和 HD1 彼此相邻,依此类推。我认为函数 beside = T 在这里很有用,但这就是我所知道的。

谢谢

可能是这样的(我更改了第二个数据框中的列名,因此所有列名都是唯一的):

# Source: https://stat.ethz.ch/pipermail/r-help/2006-March/101023.html
interleave <- function(v1,v2)
{
  ord1 <- 2*(1:length(v1))-1
  ord2 <- 2*(1:length(v2))
  c(v1,v2)[order(c(ord1,ord2))]
}

i<-c(49.36,42.61,40.14,41.33)
ls<-c(49.27,47.4,57.39,56.02)
us<-c(1.37,9.99,2.48,2.65)
dat<-as.matrix(rbind(i,ls,us))
colnames(dat) <- colnames(dat, do.NULL = FALSE, prefix = c("bc","hd","he","mi"))

i<-c(55.76,56.96,52.09,41.76)
ls<-c(39.03,40.05,45.77,50.04)
us<-c(5.21,2.99,2.13,8.20)
dat1<-as.matrix(rbind(i,ls,us))
colnames(dat1) <- colnames(dat1, do.NULL = FALSE, prefix = c("bc1","hd1","he1","mi1"))

dat2 = cbind(dat, dat1)[ , interleave(colnames(dat), colnames(dat1))]

barplot(dat2, col=c("green4","Orange","orangered4"))

您甚至可以按如下方式对条形进行分组:

par(mfrow=c(1,4))
lapply(seq(1,ncol(dat2),2), function(x) {
  if(x==1) {
    par(mar=c(5,3,2,0))
    barplot(dat2[,c(x,x+1)], col=c("green4","Orange","orangered4"))
  } else {
    par(mar=c(5,2,2,0))
    barplot(dat2[,c(x,x+1)], col=c("green4","Orange","orangered4"), yaxt="n")
  }
})