нагрузки необходимы библиотеки и создать фиктивный растр:
library(raster)
library(RColorBrewer)
library(rasterVis)
r <- raster(matrix(runif(100, -5, 10), 10))
Создать вектор цветов. Здесь я использую палитры 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))
Участок растр с 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))
Бонус упражнения!
Для автоматизации вектор суб-настройки, вы можете использовать следующие функции:
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))
или, с другой рампе:
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))
Возпроизводимо пример пожалуйста: http://stackoverflow.com/a/5963610/1412059 – Roland