R как управлять расстоянием между цветовой полосой/легендой

Я хотел бы построить карту концентрации хлорофилла, но значения разбросаны таким образом, что легенда становится нечитаемой (см. рисунок)

chl_a

Поэтому я пытаюсь контролировать расстояние между цветами в цветовой полосе/легенде. Я хотел бы, чтобы он был равномерно распределен (сохраняя при этом неравномерные разрывы на самой карте).

Пример ниже сильно упрощен и относится к растровому графику, но то же самое относится и к image.plot.

library(raster)    
r <- raster(ncol=5, nrow=4)
r[] <- 1:20
plot(r, breaks = c(0,1,2,3,5,10,20), col = rainbow(6))

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


person Lukas    schedule 27.09.2013    source источник
comment
Разве вы не можете просто разделить диапазон значений в «r» на децили и использовать это для colorRamp, который создает палитру, переданную аргументу «col»?   -  person IRTFM    schedule 28.09.2013
comment
Спасибо, это может быть способом обойти проблему, но я предпочитаю контролировать разрывы в «r» и найти решение, позволяющее контролировать расстояние между легендами.   -  person Lukas    schedule 28.09.2013


Ответы (1)


Это некрасиво, но вы можете использовать plot для карты и image.plot для легенды. Вам нужно будет добавить метки ваших пользовательских разрывов в положение равноотстоящих разрывов.

Карта участка без легенды:

library(raster)
r <- raster(ncol=5, nrow=4)
r[] <- 1:20
my_breaks = c(0,1,2,3,5,10,20)
n = 6
my_col    = rainbow(n)
plot(r, breaks = my_breaks, col = my_col, legend = FALSE, zlim=c(0,20))

Разрывы по умолчанию будут через равные промежутки от 0 до 20:

def_breaks = seq(0,20,length.out=(n+1))

Добавьте легенду, используя image.plot из пакета fields, разместив пользовательские метки разрывов в позициях разрывов по умолчанию:

library(fields)
image.plot(r, zlim = c(0,20), 
           legend.only = TRUE, 
           col = my_col,
           axis.args = list(at = def_breaks, labels = my_breaks))
person koekenbakker    schedule 03.10.2013