2010-11-30 2 views
13

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

Например:

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

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

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

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

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

РЕДАКТИРОВАТЬ:

Решение, которое я в конечном итоге использовала это:

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

решение, в результате чего вы на самом деле лучший ответ. Пожалуйста, положите его как ответ и согласитесь! Я почти пропустил это - я не ищу ответа в вопросе. – TMS 2013-08-26 08:09:41

+1

`spplot` отображает` RasterStack` с глобальной легендой для всех слоев. Пакет `raster` определяет метод` spplot`, поэтому вам не нужно преобразовывать ваш `RasterStack` в объект` Spatial * `, чтобы использовать его. – 2013-08-28 22:44:25

ответ

7

Поскольку функция изображения :: растра определяет, что изображение :: базовые аргументы могут быть переданы (и предполагает, что изображение :: база, вероятно, используется), не могли бы вы просто указать одинаковые аргументы col = и breaks = для всех обращений к image :: растровому? Вам do необходимо получить разрывы и аргументы 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) 

Конкретный пример будет способствовать этим усилиям.

4

Существует еще предстоит сделать здесь, в «растр», но здесь хак:

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 (зр пакет)

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^