Как создать растровые графики с одинаковой цветовой шкалой в R

Я создаю некоторые карты из растровых файлов, используя "растровый" пакет в R. Я хотел бы создать сравнительные растры, показывая несколько карт бок о бок. Для этого важно, чтобы используемые цветовые шкалы были одинаковыми для всех карт, независимо от значений на каждой карте. Например, если карта 1 имеет значения от 0-1, а карта 2 имеет значения от 0 до 0,5, ячейки со значением 0,5 должны иметь один и тот же цвет на обеих картах.

Например:

  • map 1 имеет значения от 0 до 1
  • map 2 имеет значения от 0 до 0,5
  • цвет идет от красного (самого низкого) до зеленого (самого высокого)

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

Я не могу найти способ сделать эту работу. Я не вижу способа установить диапазон значений пикселей для использования с функцией построения графика. setMinMax() не помогает (поскольку "plot" всегда вычисляет значения). Даже попытка установить значения вручную (например, g1 @data @max < - 10) не работает (они игнорируются при построении графика).

Наконец, создание стека карт (которые, как можно ожидать, будет отображать все в одной цветовой гамме) тоже не работает - каждая карта по-прежнему имеет собственную цветовую шкалу.

Любые мысли о том, как это сделать?

EDIT:

В результате я решил:

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 

Ответы

Ответ 1

Так как функция image:: raster указывает, что аргументы image:: base могут быть переданы (и предполагает, что возможно использование образа:: base), не могли бы вы просто указать одинаковые аргументы col = и breaks = для всех звонки в изображение:: растровые? Вам нужно получить разрывы и аргументы col "синхронно". Количество цветов должно быть на один меньше, чем количество перерывов. Пример ниже основан на классических данных вулкана, а вторая версия показывает, как диапазон значений может быть исключен из изображения:

 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(90, 200, by = 5))-1), axes = FALSE, breaks= seq(90, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano", font.main = 4)



 x <- 10*(1:nrow(volcano))
 y <- 10*(1:ncol(volcano))
 image(x, y, volcano, col = terrain.colors( length(seq(150, 200, by = 5))-1), axes = FALSE, breaks= seq(150, 200, by = 5) )
 axis(1, at = seq(100, 800, by = 100))
 axis(2, at = seq(100, 600, by = 100))
 box()
 title(main = "Maunga Whau Volcano Restricted to elevations above 150", font.main = 4)

Конкретный пример помог бы этим усилиям.

Ответ 2

В "растере" есть еще одна работа, но вот взлом:

 library(raster)
 r1 <- r2 <- r3 <- raster(ncol=10, nrow=10)
 r1[] <- runif(ncell(r1))
 r2[] <- runif(ncell(r2)) / 2
 r3[] <- runif(ncell(r3)) * 1.5
 r3 <- min(r3, 1)
 s <- stack(r1, r2, r3)


 brk <- c(0, 0.25, 0.5, 0.75, 1)
 par(mfrow=c(1,3))
 plot(r1, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
 plot(r2, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)
 plot(r3, breaks=brk, col=rainbow(4), legend=F)
 plot(r1, breaks=brk, col=rainbow(4), legend.only=T, box=F)

Вы также можете использовать функцию spplot (sp-пакет)

 s <- stack(r1, r2, r3) 
 sp <- as(s, 'SpatialGridDataFrame')
 spplot(sp)

Вы также можете отправить значения в ggplot (например, искать архивы r-sig-geo) Если ваш RasterLayer связывается с очень большим файлом, вы можете сначала сделать это, прежде чем перейти к ggplot

r <- sampleRegular(r, size=100000, asRaster=TRUE) 

а затем, возможно,

m <- as.matrix(r)

Ответ 3

Добавлен как ответ в ответ на @Tomas

Ответ, который я использовал, - это:

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ), 
    breaks=seq(min(minValue( d )),max(maxValue(d)),length.out=100) ) 

Ответ 4

Это не сработало для меня. Я использовал этот script для разделения цветовой шкалы и выбора более подходящего в соответствии с моими данными:

plot(d, col=rev(heat.colors(8, alpha = 1)), breaks = seq(0, 0.40, by = 0.05))

Ответ 5

Простое решение теперь использовать параметр zlim.

plot( d, col=rev( rainbow( 99, start=0,end=1 ) ),zlim=c(0,1) )