1

いくつかの因子の数千の観測値があり、因子ごとの最小値に従って離散1/0値に変換し、ヒートマップにプロットします。2(赤= 1、黒= 0)。これは、たとえば、A + B + C + Dが1の組み合わせ、3つの要素の組み合わせが1、2つの要素の組み合わせなどの組み合わせをプロットします。これらの組み合わせの割合を左側の垂直方向にプロットしたいと思います。ヒートマップの軸2:

nentries=10000
ci=rainbow(nentries)
set.seed=1
mean=10
## Generate some data (4 factors)
i = data.frame(
  a=round(abs(rnorm(nentries,mean-2))),
  b=round(abs(rnorm(nentries,mean-1))),
  c=round(abs(rnorm(nentries,mean+1))),
  d=round(abs(rnorm(nentries,mean+2)))
  )
minvalue = 10
# Discretise values to 1 or 0
m0 = matrix(as.numeric(i>minvalue),nrow=nrow(i))
# Remove rows with all zeros
m = m0[rowSums(m0)>0,]
# Reorder with 1,1,1,1 on top
ms =m[order(as.vector(m %*% matrix(2^((ncol(m)-1):0),ncol=1)), decreasing=TRUE),]
rowci = rainbow(nrow(ms))
colci = rainbow(ncol(ms))
heatmap(ms,
        Rowv=NA,
        labRow=" ",
        keep.dendro = FALSE,
        col=c("black","red"),
        RowSideColors=rowci,
        ColSideColors=colci,
        )

RowSideColorsは現在、nrow(ms)の色と同じ数の虹です。代わりに、要素と凡例の1/0の組み合わせを使用したいと思います。RowSideColorsの横にある:A+B+C+D 1%、など。B+C+D 10%何か案は?

4

1 に答える 1

5

あなたの質問を正しく理解できれば、各ブロックに 1 つずつ、少数の行ラベルが必要ですか? これでうまくいくはずです

colnames(ms)=LETTERS[1:4]
limits=c(which(!duplicated(ms)),nrow(ms))
l=length(limits)
toname=round((limits[-l]+ limits[-1])/2)
freq=(limits[-1]-limits[-l])/nrow(ms)

rn=rep("", nrow(ms))
for(i in toname) rn[i]=paste(colnames(ms)[which(ms[i,]==1)],collapse="")
rn[toname]=paste(rn[toname], ": ", sprintf( "%.5f", freq ), "%")

heatmap(ms, Rowv=NA, labRow=rn, col=c("black","red"))

データが既にソートされているという事実を使用して、各ブロックの中央 (凡例を表示する場所) を見つけ、ほとんどの行で空で、列名とその比率を含む凡例のベクトルを作成します。凡例を表示する行。

于 2013-01-17T14:25:50.487 に答える