Используйте один цвет для диапазона значений и включите символ неравенства на графике уровня colorkey R

У меня есть 4 rasters со значениями, охватывающими как положительные, так и отрицательные шкалы. Для 4 rasters: 1) Я хотел бы использовать только один разрыв цвета на обоих концах colorkey для всех значений за пределами диапазона +/-20, скажем. Это потому, что меня больше интересует внутрирастровая и межрастровая изменчивость меньших значений.

2) Как я могу указать метки colorkey так, чтобы они были похожи на: at=c(<=-20, -10, 0 , 10 , >=20). Здесь самое главное, как включить знак неравенства в метку colorkey

Воспроизводимый пример и образец кода показаны ниже. На изображении показан мой фактический дисплей данных с использованием функции levelplot.

library(raster)
library (colorRamps)
set.seed(100)
ras <- raster(ncol=100, nrow=100)
ras1 <- setValues(ras, (1:ncell(ras))/100 + rnorm(ncell(ras)) - 50)

s=stack(ras1,ras1,ras1,ras1)


color_levels=14 #the number of colors to use
max_abolute_value=max(abs(c(cellStats(s, min), cellStats(s, max)))) #what is the maximum absolute value of raster?
color_sequence=unique(round(seq(-max_abolute_value,max_abolute_value,length.out=color_levels+1),0))

myColorkey <- list(at=color_sequence,space = "bottom", ## where the colors change 
                   labels=list(axis.line = list(col = NA),at=color_sequence,rot=0,cex=0.9,font=6,
                               fontface=1),height=1,width=1.4)

col1 <- colorRampPalette(c("darkred", "red3","red",
                           "gray96",  "lightskyblue", "royalblue3", 
                           "darkblue"))

levelplot(s,contour=F, layout=c(4, 3),  col.regions = col1,colorkey=myColorkey,margin=FALSE,xlab=NULL,ylab=NULL,par.strip.text=list(cex=0))

person code123    schedule 17.01.2016    source источник


Ответы (2)


Что касается (i), вы можете просто reclassify растровые слои и установить все значения меньше -20 (или больше 20), например. до -20,5 (или 20,5). Я думаю, это имеет смысл, поскольку вас все равно не интересуют меньшие или большие значения. Что касается (ii), я бы рекомендовал использовать spplot и изменить ключ цвета, как описано в ?levelplot (из пакета решетка). Обратите внимание, что нужные метки можно легко вставить с помощью символов Unicode (например, больше больше или равно).

 ## reclassify data
m_rcl <- matrix(c(-100, -20, -20.5, 
                  20, 100, 20.5), 
                byrow = TRUE, ncol = 3)

s_rcl <- reclassify(s, m_rcl)

## colors
library(RColorBrewer)
cols <- brewer.pal(6, "RdBu")
cols <- rev(cols)
cols <- colorRampPalette(cols)

## display data
spplot(s_rcl, col.regions = cols(100), at = seq(-21, 21, 1),
       colorkey = list(space = "bottom", 
                       labels = list(at = seq(-20, 20, 10), 
                                     labels = c("\u2264 -20", 10, 0, 10, "\u2265 20"))))

спплот

person fdetsch    schedule 17.01.2016
comment
спасибо за предоставление проницательного решения. Реклассификация выглядит великолепно. Я пытаюсь учесть ваши предложения в моем коде выше, но я не могу понять это правильно. m_rcl <- matrix(c(-Inf, -100, -100.5,100, Inf, 100.5), byrow = TRUE, col= 3);s_rcl <- reclassify(s, m_rcl). Вы можете сгенерировать новые s, соответствующие новым m_rcl. Мне нужно colour_levels=14 or 15 maximum. В пределах levelplot выше, как я могу использовать labels в colour_sequence, чтобы значение +/- 321 на приведенном выше примере графика было заменено на <=100 and >=100? - person code123; 17.01.2016
comment
Следуя предложению @fdetsch, это работает, как и ожидалось: - person code123; 17.01.2016

Следуя предложению @fdetsch, это работает для меня:

m_rcl <- matrix(c(-375, -100, -100.5, 
                  100, 484, 100.5), 
                byrow = TRUE, ncol = 3)

s_rcl <- reclassify(s, m_rcl)


levelplot(s_rcl,contour=F,margin=FALSE,xlab=NULL,ylab=NULL,par.strip.text=list(cex=0), scales = list(x=x.scale, y=y.scale),
          col.regions = col1, at = seq(-110, 110,20),layout=c(4, 3),index.cond=list(c( 1,2,3,4,5,6,7,8,9,10,11,12)),
          colorkey = list(space = "bottom", 
                          labels = list(at = seq(-100, 100, 20), rot=0,cex=0.9,font=6,fontface=1,
                                        labels = c("\u2264 -100", "-80",  "-60" , "-40"  ,"-20" ,  
                                                   "0" ,  "20" ,  "40" ,  "60" ,  "80" ,  "\u2265 100")),height=1,width=1.4))

Спасибо большое.

person code123    schedule 17.01.2016