我正在使用以下代码构建堆积条形图
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个部分组成,则具有最长高度的部分将位于“光谱”的一端(即,真正的亮蓝色),并且最短的高度部分将位于另一端。 “光谱”(即真正暗淡的蓝色)。
这就是我得到的:
在这种情况下,我得到的是光谱一端底部的部分和光谱另一端顶部的部分。 感谢
这是一些示例数据
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
答案 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)
测试数据的示例输出:
了解盒子的颜色取决于它们达到的高度。它是决定颜色而不是底部的盒子顶部。如果您想使用(比方说)方框底部来确定颜色,请相应地修改fracs
行。
注意,我至少要修改你的axis
命令,因为它们非常小而难以阅读!
也许从函数中省略它们但从xright[1:n]-(space+wid)/2
返回mybarplot
并在xLabLocs <- mybarplot(test)
中使用,允许您在函数外使用axis
之类的额外图形命令