根据堆栈条形图R中的值进行颜色

时间:2012-01-10 00:20:10

标签: r ggplot2 bar-chart

我正在使用以下代码构建堆积条形图

test <- as.matrix(read.csv(file="test4.csv",sep=",",head=TRUE))
test <- test[,2:ncol(test)]
pdf(file="test.pdf", height=15, width=20)
par(lwd = 0.3)
xLabLocs <- barplot(test, space=0.4, xaxt='n', yaxt='n', col=heat.colors(13))
axis(1, cex.axis=0.5, las=2, at=xLabLocs, labels=colnames(test))
axis(2, cex.axis=0.5, pos=-0.5)
dev.off()

我希望每个部分的颜色与其高度成正比。例如,如果每个堆叠由X个部分组成,则具有最长高度的部分将位于“光谱”的一端(即,真正的亮蓝色),并且最短的高度部分将位于另一端。 “光谱”(即真正暗淡的蓝色)。

这就是我得到的: enter image description here

在这种情况下,我得到的是光谱一端底部的部分和光谱另一端顶部的部分。 感谢

这是一些示例数据

BARCODES,   BC1_AATCAGGC,   BC10_ACAAGGCT,  BC11_ACACGATC,  BC12_ACACTGAC
1,  2432,   420,    18, 69
2,  276,    405,    56, 86
3,  119,    189,    110,    51
4,  90, 163,    140,    68
5,  206,    280,    200,    122
6,  1389,   1080,   1075,   614
7,  3983,   3258,   4878,   2994
8,  7123,   15828,  28111,  7892
9,  8608,   48721,  52576,  21220
10, 9639,   44725,  55951,  18284
11, 8323,   45695,  32166,  7747
12, 2496,   18254,  26600,  5134
13, 1524,   8591,   18583,  3705

1 个答案:

答案 0 :(得分:1)

来自barp包的

plotrix允许您传入一个颜色矩阵以用于每个组和条,因此您可以像这样指定它们,但barp不会堆叠的条形图(即它只能barplot(...,beside=TRUE)而不是barplot(...,beside=FALSE))。

或者,您可以使用rect分别用指定的颜色(!)绘制条形图的每个矩形。

这是我设计的功能(当然需要修改):

% mybarplot( x, col=heat.colors(255), space=0.2, labels=NULL )
% makes a stacked bar plot with ncol(x) bars, each containing nrow(x)
%  stacks. Coloured according to a *global* colour scale (by value of top edge
%  of the box within the stack). This is as opposed to the same colour 
%  per category across all bars.
%
% PARAMETERS
% ----------
% x     : a matrix. COLUMNS are the categories, ROWS contain the data.
% col   : colour scheme to use. e.g. heat.colors, rainbow, ...
% space : space between bars as a fraction of bar width.
% labels: labels for each category (column) of x, default colnames(x)
%
% EXAMPLE
% -------
% bar plot with 3 categories/bars, 4 stacks in each bar.
% data <- matrix(runif(12),ncol=3,nrow=4)
% colnames(data)<-c('group a','group b','group c')
% mybarplot(data,col=heat.colors(20))
%
mybarplot <- function( x, col=heat.colors(255), space=0.2, labels=colnames(x) )
{
 maxy <- max(x)
 miny <- 0
 n    <- ncol(x)
 m    <- nrow(x)
 wid  <- 1

 # work out boundaries of each rectangle
 # note: sort the y's ascending to draw properly.
 xsort  <- apply(x,2,sort)
 xright <- rep(1:n, m) * (wid+space) - space
 ybottom <- as.vector(t(rbind(miny,xsort)))

 # work out colour of each rectangle,
 # being (y/maxy) along the colour scale.
 fracs<-as.vector(t(xsort))/maxy
 cols <- col[round(fracs*(length(col)-1))+1]

 # plot: set up grid and then draw rectangles
 plot(0, 0, type="n", 
      ylim=c(miny,maxy), xlim=c(0,max(xright)),
      xaxt='n',yaxt='n',xlab=NA,ylab=NA)
 rect(xright-wid, ybottom[1:(length(ybottom)-n)], xright, ybottom[-(1:n)],
      col=cols)

 # draw labels
 axis(1, cex.axis=0.5, las=2, at=xright[1:n]-(space+wid)/2, labels=labels)
 axis(2, cex.axis=0.5, pos=-0.5)
}

使用mybarplot(test)测试数据的示例输出: stacked bar graph with global colour scale

了解盒子的颜色取决于它们达到的高度。它是决定颜色而不是底部的盒子顶部。如果您想使用(比方说)方框底部来确定颜色,请相应地修改fracs行。

注意,我至少要修改你的axis命令,因为它们非常小而难以阅读!

也许从函数中省略它们但从xright[1:n]-(space+wid)/2返回mybarplot并在xLabLocs <- mybarplot(test)中使用,允许您在函数外使用axis之类的额外图形命令