R - изображение матрицы пикселей?

Как бы вы сделали изображение из матрицы в R?

Матричные значения будут соответствовать интенсивности пикселей на изображении (хотя меня интересуют только 0,1 значения белого или черного на данный момент.), а номера столбцов и строк соответствуют вертикальному и горизонтальному местоположению на изображении.

Сделав изображение, я хочу отобразить его на экране и сохранить его как jpg.

6 ответов

Вы можете легко отображать его на экране с помощью "изображения":

m = matrix(runif(100),10,10)
image(m)

Обратите внимание, что это имеет оси и поля. Если вы хотите сделать jpeg или png с одним пикселем изображения на ячейку матрицы, то самая простая вещь, вероятно, что-то в растровом пакете...


Настройте график без полей:

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. 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, которая эффективно выполняет множественные вызовы rect под капотом, чтобы рисовать каждый пиксель как многоугольник.


Я делаю матрицу (где вертикальная ось увеличивается вниз) одним из двух способов. Ниже приведен первый способ использования 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))


Вы можете создать тепловую карту матрицы.

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.


Попробуйте levelplot:

library(lattice)
levelplot(matrix)


Здесь второй путь (опять же, когда вертикальная ось увеличивается вниз). Этот метод проще компоновки, но имеет меньший контроль над форматом числовых значений, отображаемых на графике.

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)

licensed under cc by-sa 3.0 with attribution.