33

我想做的是采用这个矩阵:

> 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))

但是对于我的一生,我无法弄清楚如何将价值放入每个单元格中。

我错过了什么?这当然是一件很平常的事情。

4

6 回答 6

23

例如:

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])
于 2010-09-25T02:30:08.557 回答
14

heatmap.2gplots包装中尝试。cellnote 和 notecol 参数控制放置在单元格中的文本。你可能也会想要dendrogram = "none"

于 2010-09-24T18:48:06.220 回答
4

您可以使用imagetext。我个人喜欢image.plot这个fields包装,因为它在侧面添加了一个图例,但你也可以使用它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]))
于 2010-09-24T18:50:13.673 回答
3

levelplot()lattice包装中将为您提供颜色图例。不完全是您想要的,而是要考虑的事情。

于 2010-09-24T17:42:36.803 回答
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)

这会给你一个这样的情节

带值的热图

于 2019-09-09T20:35:52.693 回答
0

在 lcgong 之后(不幸的是,我可以发表直接评论)纯换位导致颜色表示出现问题。因此,我再次旋转了矩阵并且它起作用了。您可以找到如下功能。请确保所选的热图色阶适用于 3 到 11 之间的 n。如果需要,您可以在此处简单地选择另一个。

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)
于 2019-04-10T21:59:44.530 回答