Ответ 1
Попробуйте heatmap.2
из пакета gplots
. Параметры cellnote и notecol управляют текстом, помещенным в ячейки. Вероятно, вам понадобится dendrogram = "none"
.
Что я хотел бы сделать, так это взять эту матрицу:
> 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))
Но для жизни меня не могу понять, как поместить значение в каждую из ячеек.
Что мне не хватает? Конечно, это обычная вещь.
Попробуйте heatmap.2
из пакета gplots
. Параметры cellnote и notecol управляют текстом, помещенным в ячейки. Вероятно, вам понадобится dendrogram = "none"
.
Например:
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])
Вы можете использовать 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]))
levelplot()
из пакета lattice
предоставит вам легенду цвета. Не совсем то, что вы хотите, но что-то о чем подумать.
Вслед за 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)
Существует еще один более простой способ составления тепловых карт со значениями. Для этого вы можете использовать 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)
Это даст вам такой сюжет, как этот