2011-04-12 104 views
27

您如何從R中的矩陣中創建圖像?R - 像素矩陣的圖像?

矩陣值將對應於圖像上的像素亮度(雖然我現在只對0,1值爲白色或黑色感興趣),而列和行號對應於圖像上的垂直和水平位置。

通過製作圖像我的意思是顯示在屏幕上,並將其保存爲jpg。

+0

的答案在這裏應該是有用的:http://stackoverflow.com/questions/5554165/visualize-2-variable-joint-probability-mass-function-in-r/ 5554352#5554352 – Chase 2011-04-12 17:00:44

+0

將它保存爲PNG而不是JPEG,這對於像這樣的清晰「圖紙」 – mdsumner 2011-04-12 22:49:01

回答

30

您可以使用「圖像」屏幕最容易上顯示:

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

你也可以看看光柵包...

+0

+1適用於舊學校image.default(現在具有使用raster = TRUE的rasterImage支持) – mdsumner 2011-04-12 22:47:15

4

您可以創建矩陣的熱圖。

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

有關更多選項,請參閱?pheatmap

10

我做一個矩陣(其中垂直軸增加下降)兩種方式之一。以下是使用heatmap.2()的第一種方法。它可以更好地控制圖中數字值的格式(請參閱下面的formatC語句),但在更改佈局時稍微難以處理。

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

+0

有趣的是,我將不得不檢查出圖書館 – Stedy 2011-04-12 18:36:22

2

這裏的第二個方法(同樣,其中縱軸增加下去)。此方法更易於佈局,但對圖中顯示的數值格式的控制較少。

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

25

設置了無餘量一個情節:

par(mar = rep(0, 4)) 

圖像矩陣與灰度,就像spacedman的答案,但完全填充設備:

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

總結那在一個調用png()來創建文件時:

png("simpleIm.png") 
par(mar = rep(0, 4)) 
image(m, axes = FALSE, col = grey(seq(0, 1, length = 256))) 
dev.off() 

如果需要使用空間軸(默認爲[0,1]的X和Y)這樣做,則使用image.default(x, y, z, ...)形式,其中x和y給出在z上的像素的中心位置。 xy的長度可以是dim(z)+1,以給出該慣例的角點座標。

像素的中心(這是圖像默認):

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

像素的角落(需要1個額外的X和Y,及0現在是非常左下角):

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

請注意,從R 2.13圖像。默認獲得參數useRaster,該參數使用非常高效的新圖形函數rasterImage而不是舊的image,該函數實際上是多次調用rect以便將每個像素繪製爲多邊形。

+0

這對我有效。但是,我必須對行排序進行排序並對矩陣進行轉置以使圖像以正確的方向顯示。我不知道其他人是否也必須這樣做。 – gung 2016-08-16 17:26:13

3

嘗試levelplot:

library(lattice) 
levelplot(matrix)