将一个矩阵以热力图的形式展示,包括数值。

34

我希望你能够将这个矩阵:

> partb
                0.5  1.5   1a   1b   -2   -3
A1FCLYRBAB430F 0.26 0.00 0.74 0.00 0.00 0.00
A1SO604B523Q68 0.67 0.33 0.00 0.00 0.00 0.00
A386SQL39RBV7G 0.00 0.33 0.33 0.33 0.00 0.00
A3GTXOXRSE74WD 0.41 0.00 0.08 0.03 0.05 0.44
A3OOD9IMOHPPFQ 0.00 0.00 0.33 0.00 0.33 0.33
A8AZ39QM2A9SO  0.13 0.54 0.18 0.13 0.00 0.03

然后制作一个热图,其中包含现在彩色单元格中的每个值。

制作热图很容易:

> heatmap( partb, Rowv=NA, Colv=NA, col = heat.colors(256),  margins=c(5,10))

但是我怎么也想不出如何将值放入每个单元格中。

我错过了什么吗?这肯定是一个常见的问题。

6个回答

25

例如:

m <- matrix(1:30, ncol=6)
colnames(m) <- paste("C", 1:6, sep="")
rownames(m) <- paste("R", 1:5, sep="")
m

image(1:ncol(m), 1:nrow(m), t(m), col = terrain.colors(60), axes = FALSE)
axis(1, 1:ncol(m), colnames(m))
axis(2, 1:nrow(m), rownames(m))
for (x in 1:ncol(m))
  for (y in 1:nrow(m))
    text(x, y, m[y,x])

谢谢!这是最简单的答案,不需要任何额外的包,也不需要ggplot2,简短明了,从我的角度来看:完美。 - Simon C.

14

试试从gplots包中使用heatmap.2函数。cellnote和notecol参数可以控制单元格中的文本。你可能也需要将dendrogram = "none"


这个功能运行得很好,但是间距混乱了。图像的左上角,即键所在的地方,只是空白的。有没有什么想法可以居中它:heatmap.2(partb,Rowv=FALSE,Colv=FALSE,dendrogram='none',cellnote=partb,notecol="black",trace='none',rowsep=c(1,2,3,4,5,6),key=FALSE) - Nathan VanHoudnos
1
好的建议。heatmap.2函数实际上使用了布局函数并创建了4个图形输出。您可以尝试lmatlwidlhei参数,或修改函数源代码以满足您的需求,但我还没有那么深入地研究过它。 - Connor M
3
这正是我所需要的。调整lwidlhei参数非常有效。通过设置margins参数,我确保标签不会被裁剪。整个代码如下:heatmap.2(partb, Rowv=FALSE, Colv=FALSE, dendrogram='none', cellnote=partb, notecol="black", trace='none', key=FALSE, lwid = c(.01,.99), lhei = c(.01,.99), margins = c(5,15)) - Nathan VanHoudnos
我所有的x和y索引都被重新排序了,lattice中的levelplot函数将会直接使用这个顺序。 - B.Mr.W.

4
你可以使用imagetext。我个人喜欢fields包中的image.plot,因为它在侧边添加了一个图例,但你也可以使用image。例如:
require(fields)
# Make a 10x10 matrix
m = matrix(rnorm(100), nrow=10)
image.plot(m)
for (x in 1:10)
    for (y in 1:10)
        text((x-1)/9, (y-1)/9, sprintf("%0.2f", m[x,y]))

3
lattice包中的levelplot()函数可以为您提供一个颜色图例。虽然不完全符合您的要求,但可以作为思考的参考。

2

有另一种更简单的方法来制作带值的热力图。您可以使用 pheatmap 来完成此操作。

dat <- matrix(rnorm(100, 3, 1), ncol=10)
names(dat) <- paste("X", 1:10)
install.packages('pheatmap') # if not installed already
library(pheatmap)
pheatmap(dat, display_numbers = T)

这将为您提供类似于以下图片的图表:

带数值的热力图


1

根据lcgong的建议(很遗憾我无法直接评论),纯粹的转置导致了颜色表示方面的问题。因此,我再次旋转了矩阵,这样就解决了问题。您可以按如下方式找到该函数。请确保所选的热图颜色比例尺在n为3到11之间有效。如果需要,您可以在此处简单地选择另一个。

heatmap <- function(data, rowN, colN, xTitle = "", yTitle = "", numColors)
{
    # transpose and rotate matrix clockswise 90 degrees 
    dataAdjusted <- t(apply(data,2,rev))

    image(1:ncol(data), 1:nrow(data), xlab = xTitle, ylab = yTitle, dataAdjusted, col = rev(brewer.pal(numColors,"RdYlBu")), axes = FALSE)
    axis(1, 1:ncol(data), colN)
    axis(2, 1:nrow(data), rowN)

    for (x in 1:ncol(data))
        for (y in 1:nrow(data))
            # add text values into matrix based on transposed/rotated indices + round values to two digits
            text(x, y, round(dataAdjusted[x,y],2))
}

# required lib
library(RColorBrewer)

# Make a 8x8 matrix
m = matrix(rnorm(64), nrow=8)

# row names
rowN <- c("row 01", "row 02", "row 03", "row 04", "row 05", "row 06", "row 07", "row 08");
# column names
colN <- c("col 01", "col 02", "col 03", "col 04", "col 05", "col 06", "col 07", "col 08");

# without axis titles    
heatmap(m, rowN, colN, numColors = 10)

# alternatively with titles
heatmap(m, rowN, colN, xTitle = "xTest", yTitle = "yTest", numColors = 10)

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