Отображение куба растровых данных или данных RGB с пакетом решетки

Предположим, у меня есть очень простой куб данных 2x2 RGB, который я хочу построить:

set.seed(2017)
dc <- array(runif(12), dim = c(2,2,3))

Я могу построить это, просто растеризовав куб данных:

plot(as.raster(dc), interpolate = FALSE)

введите здесь описание изображения

Но я хотел бы построить этот куб данных с помощью пакета lattice (для единообразия, поскольку я в основном использую его и для других графиков).

Возможно ли это? Я смотрю на levelplot, но не могу заставить его работать.


person Davor Josipovic    schedule 13.01.2017    source источник


Ответы (2)


У вас есть проблема в том, что решетке нужна матрица, то есть числовая матрица, а растры RGB становятся факторной матрицей:

r <-as.raster(dc)
r

дает этот результат:

     [,1]      [,2]     
[1,] "#ECC478" "#780AAC"
[2,] "#89C546" "#4A6F01"

чтобы использовать его как решетку, вам нужно преобразовать его в числовую матрицу, это выглядит долго, но кажется, что это единственный способ сохранить порядок:

m <- matrix(as.numeric(as.factor(as.vector(as.matrix(r)))), ncol= 2)

levelplot(m, panel = panel.levelplot.raster)

введите здесь описание изображения

Проблема, с которой вы столкнетесь здесь, заключается в том, что вы не сохраните те же цвета RGB, но это решетчатое решение.

person Derek Corcoran    schedule 13.01.2017
comment
Спасибо, но, к сожалению, весь смысл моего вопроса и проблемы заключался в сохранении цветов RGB :(. Каким-то образом использование другой цветовой палитры, вероятно, помогло бы, но я не смог этого сделать. Например, преобразование растровых шестнадцатеричных чисел целочисленным цветам и с использованием соответствующей цветовой палитры. - person Davor Josipovic; 13.01.2017
comment
Извините за это, у меня есть идея, я постараюсь ее реализовать - person Derek Corcoran; 13.01.2017
comment
Вы можете установить правильный цвет в levelplot с помощью этой опции: col.regions=as.raster(dc). Проблема состоит в том, чтобы правильно сопоставить цвет dc с цветовым пространством. - person Davor Josipovic; 13.01.2017

Хорошо, это оказалось непростым делом с levelplot.

Я конвертирую шестнадцатеричные значения цвета RGB из растра в целые числа, а затем использую эти значения для сопоставления их с цветовой палитрой растра.

set.seed(2017)
dc <- array(runif(12), dim = c(2,2,3))
plot(as.raster(dc), interpolate = FALSE)

# convert color hexadecimals to integers
rgbInt <- apply(as.raster(dc), MARGIN = c(1,2), 
             FUN = function(str){strtoi(substring(str, 2), base = 16)})

rgbIntUnq <- unique(as.vector(rgbInt))

lattice::levelplot(x = t(rgbInt), # turn so rows become columns
                   at = c(0,rgbIntUnq),
                   col.regions = sprintf("#%06X", rgbIntUnq[order(rgbIntUnq)]), # to hex
                   ylim = c(nrow(rgbInt) + 0.5, 1 - 0.5), # plot from top to bottom
                   xlab = '', ylab = '')

введите здесь описание изображения

Легенду также можно удалить с помощью свойства colorkey = FALSE.

Интересно, есть ли более простые способы сделать то же самое.

person Davor Josipovic    schedule 13.01.2017