2015-01-21 3 views
0

Я хочу построить свой растровый слой (b1_mosaic_diff) с градиентными цветами: отрицательные значения должны превращаться из желтого в красный и положительные числа от светло-голубого до синего.участок градиента цвета стека без ggplot2

У меня есть пример кода, который не работает из, к сожалению (вместо градиента красного я поставил heat.colors же, как topo.colors для градиента синего:

plot(b1_mosaic_diff, col=ifelse(na.omit(as.data.frame(b1_mosaic_diff))<0, heat.colors(n=5), topo.colors(n=5)), main="Difference between mean & median: '+' representing higher mean") 

Я не хочу использовать ggplot, как это проще мне придерживаться нормального сюжета. есть ли Possiblity сделать это? заранее спасибо!

+5

Возпроизводимо пример пожалуйста: http://stackoverflow.com/a/5963610/1412059 – Roland

ответ

2

Это немного неудобный, но я обычно генерируют n (например, 1000) цвета с каждой из двух комплементарных colourRampPalette с (например, один из красных/желтых и один из синих с). Впоследствии, если цветная клавиша не имеет даже длины с нуля, я подмножаю вектор цвета, соответствующий более короткой части цветового ключа, в зависимости от его длины как доли более длинного конца ключа (это проще объясните в примере ниже). Наконец, я конкатенирую два вектора цветов и передаю его аргументу rasterVis::levelplotcol.regions.

Вот пример:

  1. нагрузки необходимы библиотеки и создать фиктивный растр:

    library(raster) 
    library(RColorBrewer) 
    library(rasterVis) 
    
    r <- raster(matrix(runif(100, -5, 10), 10)) 
    
  2. Создать вектор цветов. Здесь я использую палитры RColorBrewer'YlOrRd' (которые я реверсирую, чтобы сделать ее красной> оранжевой> желтой, поскольку цвета связаны с растровыми значениями в порядке от большинства отрицательных до самых положительных) и 'Blues'. Эти палитры обеспечивают только 9 цветов, поэтому мы передаем палитры до colorRampPalette, чтобы создать много интерполяционных цветов. Здесь я генерирую 1000 цветов с каждой палитрой - этого более чем достаточно для создания гладкого цветового ключа.

    Мы хотим, чтобы цветной ключ охватывал диапазон значений в растровом наборе данных, который варьировался от -5 до 10. Итак, нам нужно подмножество вектора цветов, который будет использоваться для более короткой руки цветового ключа (отрицательные значения, т. е. красные). Если быть точным, мы хотим отбросить первые 500 значений красного вектора, так как часть ключа <0 составляет половину длины части >0. Это оставляет нас с вектором 500 оранжево-желтых (мы уронили красноватый из красных) и вектор 1000 блюз.

    cols <- c(colorRampPalette(rev(brewer.pal(9, 'YlOrRd')))(1000)[501:1000], 
          colorRampPalette(brewer.pal(9, 'Blues'))(1000)) 
    
  3. Участок растр с levelplot, который является немного более гибким, чем обычный метод участка для raster объектов. Для удобства мы сначала создаем вектор нижней и верхней границ (z-пределы).

    zrng <- range(pretty(c(minValue(r), maxValue(r)))) 
    
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000), 
          col.regions=cols, scales=list(draw=FALSE)) 
    

    enter image description here

  4. Бонус упражнения!

    Для автоматизации вектор суб-настройки, вы можете использовать следующие функции:

    asym_colours <- function(r, pal1, pal2, n=2000) { 
        zrng <- range(pretty(c(minValue(r), maxValue(r)))) 
        brks <- do.call(seq, as.list(c(max(abs(zrng)) * c(-1, 1), length.out=2*n))) 
        c(pal1(n)[(sum(brks < zrng[1]) + 1):n], 
        pal2(n)[1:(sum(brks < zrng[2] & brks > 0) + 1)]) 
    } 
    

    Например:

    r <- raster(matrix(runif(100, -0.3, 0.1), 10))  
    cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'YlOrRd'))), 
            colorRampPalette(brewer.pal(9, 'Blues'))) 
    zrng <- range(pretty(c(minValue(r), maxValue(r)))) 
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000), 
          col.regions=cols, scales=list(draw=FALSE)) 
    

    enter image description here

    или, с другой рампе:

    cols <- asym_colours(r, colorRampPalette(rev(brewer.pal(9, 'GnBu'))), 
            colorRampPalette(brewer.pal(9, 'PuRd'))) 
    zrng <- range(pretty(c(minValue(r), maxValue(r)))) 
    levelplot(r, margin=FALSE, at=seq(zrng[1], zrng[2], diff(zrng)/1000), 
          col.regions=cols, scales=list(draw=FALSE)) 
    

    enter image description here

+0

Большое спасибо за ваши усилия! Это очень помогло и объяснилось очень легко! – user2978751

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