web-dev-qa-db-fra.com

afficher une matrice, y compris les valeurs, sous forme de carte thermique

Ce que j'aimerais faire, c'est 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 faites une carte thermique qui a chacune des valeurs dans les cellules maintenant colorées.

Faire une carte thermique 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 rate? C'est sûrement une chose courante.

30
Nathan VanHoudnos

Essayez heatmap.2 du package gplots . Les paramètres cellnote et notecol contrôlent le texte placé dans les cellules. Vous voudrez probablement dendrogram = "none" ainsi que.

13
Connor M

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])
17
lcgong

Vous pouvez utiliser image et text. Personnellement, j'aime image.plot du package fields, car il ajoute une légende sur le côté, mais vous pouvez également l'utiliser avec image.

Donc 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]))
4
nico

levelplot() du paquet lattice vous donnera une légende de couleur. Pas exactement ce que vous voulez mais quelque chose à penser.

3
Maiasaura

Il existe un autre moyen plus simple de créer des heatmaps avec des valeurs. Vous pouvez utiliser pheatmap pour ce 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 complot comme celui-ci

Heatmap with values

1
Biginer

Après lcgong (malheureusement je peux poster un commentaire direct) la transposition pure a conduit à des problèmes de représentation des couleurs. En conséquence, j'ai de nouveau tourné la matrice et cela a fonctionné. Vous pouvez trouver la fonction comme suit. Veuillez vous assurer que l'échelle de couleurs de la carte thermique sélectionnée fonctionne avec n entre 3 et 11. Si vous le souhaitez, vous pouvez simplement en sélectionner une 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)
0
Mathias S.