R - изображение пиксельной матрицы? - PullRequest
31 голосов
/ 12 апреля 2011

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

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

Под созданием изображения я имею в виду вывод его на экран и сохранение его в формате jpg.

Ответы [ 6 ]

33 голосов
/ 12 апреля 2011

Вы можете отобразить его на экране проще всего используя 'image':

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

Вы также можете взглянуть на растровый пакет ...

25 голосов
/ 13 апреля 2011

Настройка участка без полей:

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

Если вам нужно сделать это с пространственными осями (по умолчанию [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 под капотом для рисования пиксель как многоугольник.

12 голосов
/ 12 апреля 2011

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

4 голосов
/ 12 апреля 2011

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

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 для дополнительных опций.

3 голосов
/ 23 мая 2012

Попробуйте план уровня:

library(lattice)
levelplot(matrix)
2 голосов
/ 12 апреля 2011

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

 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...