R 中的热图如何确定颜色?
How colors are determined by heatmap in R?
我正在使用 R 从矩阵中的值制作热图。
library(RColorBrewer)
a <- structure(c(16, 10, 7, 8, 12, 1, 9, 11, 20, 15, 5, 8, 9, 14, 11, 5, 6, 2, 9, 6, 9, 6, 12, 11, 11), .Dim = c(5L, 5L))
heatmap(a, Rowv = NA, Colv = NA, col=colorRampPalette(brewer.pal(8, "Oranges"))(5))
矩阵如下所示。
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 16 1 5 5 9
[2,] 10 9 8 6 6
[3,] 7 11 9 2 12
[4,] 8 20 14 9 11
[5,] 12 15 11 6 11
热图如下所示。
有点奇怪。 a[2, 1]
为 10,显示为深红色(蓝色圆圈)。 a[3, 2]
为 11,显示为橙色(绿色圆圈)。为什么较大的值比较小的值颜色较浅?
heatmap
或image
如何决定每个网格的颜色?
如果你勾选 help page:
scale: character indicating if the values should be centered and
scaled in either the row direction or the column direction,
or none. The default is ‘"row"’ if ‘symm’ false, and
‘"none"’ otherwise.
默认设置为scale="row"
。为了准确,你需要做 scale="none"
:
colnames(a) = paste0("col",1:5)
rownames(a) = paste0("row",1:5)
col1 col2 col3 col4 col5
row1 16 1 5 5 9
row2 10 9 8 6 6
row3 7 11 9 2 12
row4 8 20 14 9 11
row5 12 15 11 6 11
heatmap(a, Rowv = NA, Colv = NA,
col=colorRampPalette(brewer.pal(8, "Oranges"))(5),
scale="none")
您可以认为颜色从 0 到 1 等距分布。在您的示例中有 5 种颜色,0-0.2 是第一种颜色,0.21-0.4 是第二种颜色,依此类推。剩下的就是将您的值标准化为 0-1 的比例并将它们放入相应的颜色中。
在上面的代码中,我们没有按行或列缩放,所以我们可以使用image.R中的部分相关代码,我们尝试使用点图手动显示:
Col = colorRampPalette(brewer.pal(8, "Oranges"))(5)
idx = which(!is.na(a),arr.ind=TRUE)
z = c(a)
zlim = range(z)
nc = length(Col)
z = (z - zlim[1L])/diff(zlim)
zi = floor((nc - 1e-5) * z + 1e-7)
plot(idx[,2],idx[,1],col=Col[zi+1],pch=15,cex=4,xaxt="n",yaxt="n")
axis(1,at=1:nc,colnames(a))
axis(2,at=1:nc,rownames(a))
我正在使用 R 从矩阵中的值制作热图。
library(RColorBrewer)
a <- structure(c(16, 10, 7, 8, 12, 1, 9, 11, 20, 15, 5, 8, 9, 14, 11, 5, 6, 2, 9, 6, 9, 6, 12, 11, 11), .Dim = c(5L, 5L))
heatmap(a, Rowv = NA, Colv = NA, col=colorRampPalette(brewer.pal(8, "Oranges"))(5))
矩阵如下所示。
> a
[,1] [,2] [,3] [,4] [,5]
[1,] 16 1 5 5 9
[2,] 10 9 8 6 6
[3,] 7 11 9 2 12
[4,] 8 20 14 9 11
[5,] 12 15 11 6 11
热图如下所示。
有点奇怪。 a[2, 1]
为 10,显示为深红色(蓝色圆圈)。 a[3, 2]
为 11,显示为橙色(绿色圆圈)。为什么较大的值比较小的值颜色较浅?
heatmap
或image
如何决定每个网格的颜色?
如果你勾选 help page:
scale: character indicating if the values should be centered and scaled in either the row direction or the column direction, or none. The default is ‘"row"’ if ‘symm’ false, and ‘"none"’ otherwise.
默认设置为scale="row"
。为了准确,你需要做 scale="none"
:
colnames(a) = paste0("col",1:5)
rownames(a) = paste0("row",1:5)
col1 col2 col3 col4 col5
row1 16 1 5 5 9
row2 10 9 8 6 6
row3 7 11 9 2 12
row4 8 20 14 9 11
row5 12 15 11 6 11
heatmap(a, Rowv = NA, Colv = NA,
col=colorRampPalette(brewer.pal(8, "Oranges"))(5),
scale="none")
您可以认为颜色从 0 到 1 等距分布。在您的示例中有 5 种颜色,0-0.2 是第一种颜色,0.21-0.4 是第二种颜色,依此类推。剩下的就是将您的值标准化为 0-1 的比例并将它们放入相应的颜色中。
在上面的代码中,我们没有按行或列缩放,所以我们可以使用image.R中的部分相关代码,我们尝试使用点图手动显示:
Col = colorRampPalette(brewer.pal(8, "Oranges"))(5)
idx = which(!is.na(a),arr.ind=TRUE)
z = c(a)
zlim = range(z)
nc = length(Col)
z = (z - zlim[1L])/diff(zlim)
zi = floor((nc - 1e-5) * z + 1e-7)
plot(idx[,2],idx[,1],col=Col[zi+1],pch=15,cex=4,xaxt="n",yaxt="n")
axis(1,at=1:nc,colnames(a))
axis(2,at=1:nc,rownames(a))