这是我构建的一个条形图:
data<-read.table(text="Unsuit lsuit imp
164 124 480
115 28 31
55 165 9
",header=T)
barplot(as.matrix(data))
这是一个堆叠的条形图,每个条形有三个子条(底部,中间和顶部)(抱歉使用错误的行话)
我想做的是:
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中执行此操作。我不想更改对我来说很重要的条形顺序。
谢谢
答案 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')))
结果: