为热力图设置颜色比例尺

7
我正在尝试使用热图比较数据。我希望将颜色比例设置为所有数据的相同。例如,所有值都在-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))

颜色比例尺将跨越数据范围,因此对于数据范围从-1到+1的相同红绿(50),它将是相同的红色或绿色,并且对于在-.2到+.2范围内的数据也是如此。让颜色跨越[-1,1]的数据范围在[-.2,.2]范围内变化的原因是为了能够可视化数据的差异,而不必查看或知道数据范围--这是一个探索性步骤。
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)]

使用这些向量来着色热图:
heatmap(r.matrix, Colv = NA, col = rg)

enter image description here

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

第二个热力图中的颜色范围比第一个热力图中的范围小。

感谢Sven Hohenstein--颜色范围将跨越数据范围,因此使用相同的redgreen(50),对于从-1到+1的数据范围以及从-.2到+.2的数据范围,它将是相同的红色或绿色。但是让颜色跨越[-1,1]在数据范围[-.2,.2]上的原因是为了能够可视化数据之间的差异。两组数据之间的差异有多大是未知的... - user2783615
@user2783615 我更新了答案。现在,可以创建第二个颜色向量,而无需事先知道矩阵2的范围(但它必须更小)。 - Sven Hohenstein
非常感谢Sven!你的解决方案很好。我最终将所有后聚类矩阵合并,并在它们之间添加了空列,然后一起绘制,以便将它们放在相同的比例尺上。无论如何,这提供了良好的视觉辅助。 - user2783615

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接