Как построить несколько изображений rgb в R

#r #image #pixel #lattice #r-raster

Вопрос:

Итак, у меня есть 4 изображения в следующем формате

 > dim(images)
[1]  4 32 32  3
 

Каждое изображение имеет размер 32×32 пикселя в формате rgb, где каждый пиксель принимает значение в [0,1]. Я могу построить одно изображение за раз с помощью

 images2 <- rgb(images[1,,,1],images[1,,,2],images[1,,,3])
dim(images2) <- dim(images[1,,,1])
grid.raster(images2, interpolate=F)
 

Как я могу получить все четыре изображения в одном сюжете? par(mfrow=c(2,2)) похоже, это не работает, и я поискал на форуме и gridArrange безуспешно попытался.

Должен ли я обратиться к решетке, ggplot? Я новичок в растровых объектах, поэтому не знаю, как подойти к проблеме.

Спасибо

Ответ №1:

использование растергроба и заимствование из пакета gridExtra должно помочь:

 
library(gridExtra)

## Let's create some imgaes, for us who don't have your data:
if(!exists("images")) {
    random.rgb <- floor( runif( n=4*32*32*3, min=0, max=256 ) ) / 255
    images <- array( random.rgb, dim=c(4,32,32,3) )
}

## create a list of the rasters, note, have to use rasterGrob for this:

rgb.images <- lapply( 1:4, function(i) {
    r <- rgb( images[i,,,1], images[i,,,2], images[i,,,3] )
    dim(r) <- dim( images[1,,,1] )
    rasterGrob(r)
})

grid.arrange( grobs=rgb.images )


 

обратите внимание, что с grid.arrange помощью параметра from gridArrange вам необходимо использовать аргумент grobs при предоставлении списка, и вы не можете просто использовать первый позиционный аргумент.

Вот дополнительный подход, вместо этого использующий класс растра из grDevices, который упрощает использование с обычными элементами управления построением (par и т. Д.):

 
rgb.images2 <- lapply( 1:4, function(i) {
    r <- rgb( images[i,,,1], images[i,,,2], images[i,,,3] )
    dim(r) <- dim( images[1,,,1] )
    as.raster(r)
})

par(mfrow=c(2,2))
for( i in 1:4 ) {
    plot( rgb.images2[[i]] )
    title( paste("Figure",i) )
}

 

Комментарии:

1. Это хорошо работает, спасибо! Однако можно ли настроить так, чтобы вертикальное пространство совпадало с горизонтальным пространством между изображениями? И можно ли добавлять заголовки для каждого изображения?

2. Я добавил другое решение, используя as.raster() и plot() вместо этого, просто казалось, что с ним легче работать.