отобразить матрицу, включая значения, в качестве тепловой карты - PullRequest
27 голосов
/ 24 сентября 2010

Что я хотел бы сделать, это взять эту матрицу:

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

Но я не могу понять, как определить значение в каждой из ячеек.

Чего мне не хватает? Конечно, это обычное дело.

Ответы [ 5 ]

17 голосов
/ 25 сентября 2010

Например:

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])
13 голосов
/ 24 сентября 2010

Попробуйте heatmap.2 из пакета gplots.Параметры cellnote и notecol управляют текстом, помещаемым в ячейки.Вы, вероятно, также захотите dendrogram = "none".

4 голосов
/ 24 сентября 2010

Вы можете использовать image и text.Мне лично нравится 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]))
3 голосов
/ 24 сентября 2010

levelplot() из пакета lattice даст вам цветную легенду.Не совсем то, что вы хотите, но о чем подумать.

0 голосов
/ 11 апреля 2019

После 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)
...