Comment feriez-vous une image à partir d'une matrice en R?
Les valeurs matricielles correspondraient à l'intensité des pixels sur l'image (bien que je m'intéresse uniquement aux valeurs 0,1 blanches ou noires pour le moment.), Tandis que les numéros de colonne et de ligne correspondent à l'emplacement vertical et horizontal sur l'image.
Par faire une image, je veux dire l'afficher à l'écran et l'enregistrer au format jpg.
Vous pouvez l'afficher sur l'écran plus facilement en utilisant 'image':
m = matrix(runif(100),10,10)
par(mar=c(0, 0, 0, 0))
image(m, useRaster=TRUE, axes=FALSE)
Vous pouvez également consulter le package raster ...
Configurez un tracé sans marge:
par(mar = rep(0, 4))
Image la matrice avec des niveaux de gris, comme la réponse de spacedman mais remplissant complètement l'appareil:
m = matrix(runif(100),10,10)
image(m, axes = FALSE, col = grey(seq(0, 1, length = 256)))
Enveloppez cela dans un appel à png () pour créer le fichier:
png("simpleIm.png")
par(mar = rep(0, 4))
image(m, axes = FALSE, col = grey(seq(0, 1, length = 256)))
dev.off()
Si vous devez le faire avec des axes spatiaux (par défaut à [0,1] pour X et Y), utilisez la forme image.default(x, y, z, ...)
où x et y donnent les positions centrales des pixels en z. x
et y
peuvent être de longueur dim (z) + 1 pour donner les coordonnées des coins pour cette convention.
Centres de pixels (c'est la valeur par défaut pour l'image):
x <- seq(0, 1, length = nrow(m))
y <- seq(0, 1, length = ncol(m))
image(x, y, m, col = grey(seq(0, 1, length = 256)))
Coins de pixels (besoin de 1 x et y supplémentaire, et 0 est maintenant le coin tout en bas à gauche):
x <- seq(0, 1, length = nrow(m) + 1)
y <- seq(0, 1, length = ncol(m) + 1)
image(x, y, m, col = grey(seq(0, 1, length = 256)))
Notez que depuis R 2.13 image.default gagne un argument useRaster
qui utilise la fonction graphique très efficace rasterImage
plutôt que l'ancienne image
qui est en fait plusieurs appels à rect
sous le capot pour dessiner chaque pixel sous forme de polygone.
Je fais une matrice (où l'axe vertical augmente en descendant) de deux manières. Voici la première façon d'utiliser heatmap.2 (). Il a plus de contrôle sur la façon dont les valeurs numériques sont formatées dans le tracé (voir l'instruction formatC ci-dessous), mais est un peu plus difficile à gérer lors du changement de la disposition.
library(gplots)
#Build the matrix data to look like a correlation matrix
x <- matrix(rnorm(64), nrow=8)
x <- (x - min(x))/(max(x) - min(x)) #Scale the data to be between 0 and 1
for (i in 1:8) x[i, i] <- 1.0 #Make the diagonal all 1's
#Format the data for the plot
xval <- formatC(x, format="f", digits=2)
pal <- colorRampPalette(c(rgb(0.96,0.96,1), rgb(0.1,0.1,0.9)), space = "rgb")
#Plot the matrix
x_hm <- heatmap.2(x, Rowv=FALSE, Colv=FALSE, dendrogram="none", main="8 X 8 Matrix Using Heatmap.2", xlab="Columns", ylab="Rows", col=pal, tracecol="#303030", trace="none", cellnote=xval, notecol="black", notecex=0.8, keysize = 1.5, margins=c(5, 5))
Vous pouvez créer une carte thermique de la matrice.
library(pheatmap)
# Create a 10x10 matrix of random numbers
m = matrix(runif(100), 10, 10)
# Save output to jpeg
jpeg("heatmap.jpg")
pheatmap(m, cluster_row = FALSE, cluster_col = FALSE, color=gray.colors(2,start=1,end=0))
dev.off()
Voir ?pheatmap
pour plus d'options.
Essayez levelplot:
library(lattice)
levelplot(matrix)
Voici la deuxième façon (là encore, où l'axe vertical augmente en descendant). Cette méthode est plus facile à mettre en page, mais a moins de contrôle sur le format des valeurs numériques affichées dans le tracé.
library(plotrix)
#Build the matrix data to look like a correlation matrix
n <- 8
x <- matrix(runif(n*n), nrow=n)
xmin <- 0
xmax <- 1
for (i in 1:n) x[i, i] <- 1.0 #Make the diagonal all 1's
#Generate the palette for the matrix and the legend. Generate labels for the legend
palmat <- color.scale(x, c(1, 0.4), c(1, 0.4), c(0.96, 1))
palleg <- color.gradient(c(1, 0.4), c(1, 0.4), c(0.96, 1), nslices=100)
lableg <- c(formatC(xmin, format="f", digits=2), formatC(1*(xmax-xmin)/4, format="f", digits=2), formatC(2*(xmax-xmin)/4, format="f", digits=2), formatC(3*(xmax-xmin)/4, format="f", digits=2), formatC(xmax, format="f", digits=2))
#Set up the plot area and plot the matrix
par(mar=c(5, 5, 5, 8))
color2D.matplot(x, cellcolors=palmat, main=paste(n, " X ", n, " Matrix Using Color2D.matplot", sep=""), show.values=2, vcol=rgb(0,0,0), axes=FALSE, vcex=0.7)
axis(1, at=seq(1, n, 1)-0.5, labels=seq(1, n, 1), tck=-0.01, padj=-1)
#In the axis() statement below, note that the labels are decreasing. This is because
#the above color2D.matplot() statement has "axes=FALSE" and a normal axis()
#statement was used.
axis(2, at=seq(1, n, 1)-0.5, labels=seq(n, 1, -1), tck=-0.01, padj=0.7)
#Plot the legend
pardat <- par()
color.legend(pardat$usr[2]+0.5, 0, pardat$usr[2]+1, pardat$usr[2], paste(" ", lableg, sep=""), palleg, align="rb", gradient="y", cex=0.7)