R – изображение матрицы пикселей?
Как бы вы сделали изображение из матрицы в R?
Значения матрицы будут соответствовать интенсивности пикселей на изображении (хотя меня интересуют только 0,1 значения белого или черного на данный момент.), А номера столбцов и строк соответствуют вертикальному и горизонтальному местоположению на изображении.
Сделав изображение, я хочу отобразить его на экране и сохранить его как jpg.
- Java: JPanel не масштабируется
- Ошибка WPF: не удается найти управляющий элемент FrameworkElement для целевого элемента
- Почему мой преобразуемый атрибут Core Data не использует мой собственный NSValueTransformer?
- Должен ли я хранить мои изображения в базе данных или папках?
- Как вертикально выравнивать изображение внутри div?
- Повернуть изображение вокруг символа (JAVA)
- Обнаружение, если два изображения визуально идентичны
- Загрузка изображений с использованием Node.js, Express и Mongoose
- Android byte для изображения в Camera.onPreviewFrame
- input type = "image" показывает нежелательную границу в Chrome и неработающую ссылку в IE7
- Преобразование растрового изображения в GrayScale в Android
- Высококачественное сжатие JPEG с помощью c #
- Перетащить пакетный файл для нескольких файлов?
Вы можете легко отобразить его на экране с помощью «изображения»:
m = matrix(runif(100),10,10) par(mar=c(0, 0, 0, 0)) image(m, useRaster=TRUE, axes=FALSE)
Вы также можете посмотреть растровый пакет …
Настройте график без полей:
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)