你如何从R中的矩阵中制作图像?
矩阵值对应于图像上的像素强度(虽然我只对此时的0,1值白色或黑色感兴趣。),而列和行号对应于图像上的垂直和水平位置。
通过制作图像我的意思是在屏幕上显示它并将其保存为jpg。
答案 0 :(得分:33)
您可以使用“图片”在屏幕上最简单地显示它:
m = matrix(runif(100),10,10)
par(mar=c(0, 0, 0, 0))
image(m, useRaster=TRUE, axes=FALSE)
您还可以查看光栅包...
答案 1 :(得分:25)
设置无边距的图:
par(mar = rep(0, 4))
使用灰度图像生成矩阵,就像间隔人的答案一样,但是完全填满了设备:
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()
如果您需要使用空间轴(X和Y默认为[0,1]),请使用image.default(x, y, z, ...)
形式,其中x和y给出z中像素的中心位置。 x
和y
的长度为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中,image.default获得了一个参数useRaster
,该参数使用非常有效的新图形函数rasterImage
而不是旧的image
,它实际上是对{{1}的多次调用在引擎盖下将每个像素绘制为多边形。
答案 2 :(得分:12)
我做了一个矩阵(垂直轴向下增加)两种方式之一。下面是使用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))
答案 3 :(得分: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
。
答案 4 :(得分:3)
尝试使用levelplot:
library(lattice)
levelplot(matrix)
答案 5 :(得分: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)
答案 6 :(得分:0)
使用ggplot2
:
library(tidyverse)
n <- 12
m <- matrix(rnorm(n*n),n,n)
rownames(m) <- colnames(m) <- 1:n
df <- as.data.frame(m) %>% gather(key='y', value='val')
df$y <- as.integer(df$y)
df$x <- rep(1:n, n)
ggplot(df, aes(x, y, fill= val)) +
geom_tile() +
geom_text(aes(x, y, label=round(val,2))) +
scale_fill_gradient(low = "white", high = "red") +
theme_bw()