2013-12-18 70 views
6

我想比較使用熱圖的數據。我想將色階設置爲全部相同。例如,所有的值在-0.5到0.5之間;設置熱圖的色標

我一直在使用gplots redgreen(50)。但顏色強度在不同的數據集上重新調整。

例如: 我r.matrix範圍可以從-1到+1;和我的r1.matrix可能範圍從-0.2到+0.2。通過繪製兩個熱圖,如果放在同一色標,我希望爲r1.matrix顏色更暗淡得多

hm <- heatmap(r.matrix, Colv = NA, col = redgreen(50)) 
hm1 <- heatmap(r1.matrix, Colv = NA, col = redgreen(50)) 

顏色規模將在整個數據範圍跨度大,因此與相同redgreen(50)對於範圍從-1到+1的數據以及範圍從-2到+2的數據,它將是相同的紅色或綠色。讓數據範圍爲[-.2,2.2]上的顏色跨越[-1,1]的原因是能夠可視化數據的差異,而無需查看或瞭解數據範圍 - 探索步驟。

回答

4

命令redgreen(50)與您的實際值無關,並返回50種顏色的向量。你可以使用這個顏色矢量並提取它的一個子集來適應你的第二個矩陣。

一個例子:

set.seed(1) 
r.matrix <- matrix(runif(16, -1, 1), 4, 4) 
r1.matrix <- r.matrix/5 

在矩陣r1.matrix的值在r.matrix值的五分之一。

現在,顏色向量可以通過以下方式創建:

library(gplots) 

rg <- redgreen(50)  # the original color vector 

# range of values in first matrix around median 
r1 <- range(r.matrix) - median(r.matrix) 
# range of values in second matrix around median 
r2 <- range(r1.matrix) - median(r1.matrix) 
# relative distances to median of second compared to first matrix 
prop <- r1/r2 

# center of colcor vector 
cent <- length(rg)/2 + 0.5 

# calculate indices of shorter color vector for the second matrix 
ind <- cent/prop 
idx <- round(cent - c(1, -1) * ind) 

# new color vector 
rg_new <- rg[Reduce(seq, idx)] 

使用這些向量着色熱圖:

enter image description here

heatmap(r1.matrix, Colv = NA, col = rg_new) 

enter image description here

第二個熱圖中的顏色範圍小於第一個熱圖中的範圍。

+0

謝謝Sven Hohenstein - 顏色比例將跨越數據範圍,因此對於相同的紅綠(50),數據範圍從-1到+1的數據將是相同的紅色或綠色,數據範圍從-.2到+.2。但讓數據範圍[-.2,2.2]上的顏色跨越[-1,1]的原因是能夠可視化數據的差異。兩組數據之間有多大的差異未知...... – user2783615

+0

@ user2783615我更新了答案。現在,可以在事先不知道矩陣2的範圍的情況下創建第二個顏色矢量(但它必須更小)。 –

+0

非常感謝斯文!你的是一個很好的解決方案。我最終將所有後聚類矩陣結合起來,並在它們之間添加空列,然後將它們組合在一起,以便將它們放在相同的比例上。無論如何,它給了很好的視覺幫助。 – user2783615