afficher une matrice, y compris les valeurs, en tant que heatmap
Question
Ce que je voudrais faire est de prendre cette matrice:
> 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
Et puis faire un heatmap qui a chacune des valeurs dans les cellules maintenant colorées.
Faire heatmap est facile:
> heatmap( partb, Rowv=NA, Colv=NA, col = heat.colors(256), margins=c(5,10))
Mais pour la vie de moi je ne peux pas comprendre comment mettre la valeur dans chacune des cellules.
Qu'est-ce que je manque? Assurément, c'est une chose commune.
Autres conseils
Par exemple:
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])
Vous pouvez utiliser image
et text
. Personnellement, je aime image.plot
du paquet fields
, car il ajoute une légende sur le côté, mais vous pouvez l'utiliser avec image
aussi.
Ainsi, par exemple
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()
du paquet lattice
vous donnera une légende des couleurs. Pas exactement ce que vous voulez, mais quelque chose à penser.
Après lcgong (malheureusement je peux poster un commentaire direct) la simple transposition conduit à des problèmes avec la représentation des couleurs. Par conséquent, je nouveau mis en rotation la matrice et cela a fonctionné. Vous pouvez trouver la fonction comme suit. S'il vous plaît assurez-vous que l'échelle de couleur heatmap sélectionné fonctionne avec n compris entre 3 et 11. Si vous le souhaitez, vous pouvez simplement sélectionner un autre ici.
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)
Il y a une autre façon plus simple de faire heatmaps avec des valeurs. Vous pouvez utiliser pheatmap pour le faire.
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)
Cela vous donnera un terrain comme celui-ci