R改变堆积条形图中条形的颜色

时间:2016-03-25 17:51:33

标签: r bar-chart

这是我构建的一个条形图:

data<-read.table(text="Unsuit   lsuit   imp
164 124 480
115 28  31
55  165 9
",header=T)

barplot(as.matrix(data))

enter image description here

这是一个堆叠的条形图,每个条形有三个子条(底部,中间和顶部)(抱歉使用错误的行话)

我想做的是:

1)在Unsuit(对应于值164),lsuit(28)中的中间子栏和imp中的顶部子栏中给出底部子栏( 9)相同的颜色(棕色)

2)中间子栏Unsuit(115),lsuit中的底部子栏和imp相同颜色的中间子栏(红色)

3)Unsuit(55)中的顶部子栏,'lsuit (165) and bottom sub-bar in imp`(480)中的顶部子栏相同颜色(绿色)

然后在图例中显示子栏的颜色

非常感谢建议如何在R中执行此操作。我不想更改对我来说很重要的条形顺序。

谢谢

1 个答案:

答案 0 :(得分:0)

我认为唯一的方法是手工绘制矩形。 这是一个可能的函数(非常通用,它需要一个值矩阵和一个相应颜色的矩阵),它们可以提供你想要的结果:

# custom function
customBarPlot <- function(valueMatrix,colorMatrix,main=NULL){

  stopifnot(all(dim(valueMatrix) == dim(colorMatrix)))

  maxVal <- max(apply(valueMatrix,2,cumsum))

  # draw an empty plot  
  plot(0,type='n',xlim=c(0,1),ylim=c(0,maxVal),main = main,xlab=NA,ylab=NA,axes=FALSE)

  nCols <- ncol(valueMatrix)

  space <- 0.03 # 3% of the space between bars
  barWidth <- (1.0 - nCols * space + space) / nCols

  # add the rectangles
  for(col in 1:nCols){

    centerOfRect <- col * (space + barWidth) - barWidth / 2

    centers <- rep.int(centerOfRect,nCols)

    rect(xleft=centers - barWidth / 2,
         xright=centers + barWidth / 2,
         ybottom=c(0,head(cumsum(valueMatrix[,col]),-1)),
         ytop=cumsum(valueMatrix[,col]),
         col=colorMatrix[,col])
  }

  # add axis
  axis(1,at=1:nCols * (space + barWidth) - barWidth / 2, labels=colnames(valueMatrix),tick=FALSE) 
  axis(2)

  invisible()
}


# let's call the function

data<-read.table(text="Unsuit   lsuit   imp
164 124 480
115 28  31
55  165 9
",header=T)

customBarPlot(valueMatrix=as.matrix(data),
              colorMatrix=rbind(c('Brown','Red','Green'),
                                c('Red','Brown','Red'),
                                c('Green','Green','Brown')))

结果:

enter image description here