Image R d'une matrice de pixels?

comment feriez-vous une image à partir d'une matrice en R?

les valeurs de la matrice correspondraient à l'intensité du pixel sur l'image (bien que je ne sois intéressé que par les valeurs de 0,1 blanc ou noir pour le moment.), tandis que les numéros de colonne et de ligne correspondent à l'emplacement vertical et horizontal de l'image.

Par une image, je veux dire l'afficher sur l'écran et l'enregistrer en format jpg.

28
demandé sur Eric Leschinski 2011-04-12 20:20:42

6 réponses

Vous pouvez l'afficher sur l'écran le plus facile en utilisant 'image':

m = matrix(runif(100),10,10)
par(mar=c(0, 0, 0, 0))
image(m, useRaster=TRUE, axes=FALSE)

Vous pouvez aussi regarder le paquet raster...

33
répondu Spacedman 2018-01-05 21:09:41

mettre en place un tracé sans marge:

par(mar = rep(0, 4))

l'Image de la matrice avec des niveaux de gris, comme spacedman de répondre, mais de remplir complètement l'appareil:

m = matrix(runif(100),10,10)
image(m, axes = FALSE, col = grey(seq(0, 1, length = 256)))

Wrap que, dans un appel à l'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) alors utilisez le image.default(x, y, z, ...) forme où x et y donnent les positions centrales des pixels en Z. x et y peut être de longueur dim(z) + 1 pour donner coin les coordonnées de cette convention.

Centres des pixels (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 des pixels (besoin de 1 x et y supplémentaire, et 0 est maintenant le coin 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 de L'image r 2.13.default gagne un argument useRaster qui utilise la fonction graphique newish très efficace rasterImage plutôt que de l'ancien image qui est en fait plusieurs appels à rect sous le capot pour dessiner chaque pixel comme un polygone.

25
répondu mdsumner 2014-01-07 21:55:52

je fais une matrice (où l'axe vertical augmente), l'une des deux façons. 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 graphique (Voir l'instruction formatC ci-dessous), mais est un peu plus difficile à traiter lors de la modification de la mise en page.

 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

11
répondu bill_080 2011-04-12 17:11:34

vous pouvez créer une heatmap 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
répondu stepthom 2011-04-12 16:28:04

Essayez levelplot:

library(lattice)
levelplot(matrix)
3
répondu rockswap 2012-05-23 00:11:55

voici le deuxième chemin (encore une fois, où l'axe vertical augmente en descendant). Cette méthode est plus facile à disposition, mais a moins de contrôle sur le format des valeurs numériques affichées dans l'intrigue.

 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
répondu bill_080 2011-04-14 19:26:43