web-dev-qa-db-fra.com

R - image d'une matrice de pixels?

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.

31
Adam SO

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

33
Spacedman

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.

25
mdsumner

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

enter image description here

12
bill_080

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.

4
stepthom

Essayez levelplot:

library(lattice)
levelplot(matrix)
3
rockswap

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)

enter image description here

2
bill_080