2015-03-24 3 views
1
library(raster) 
library(rasterVis) 

Я хотел бы сделать пользовательский colorkey для моей карты. Мои данные охватывают как отрицательные, так и положительные значения. Вот что я пытался сделать:Сопоставьте конкретные значения с определенным цветом в colourey levelplot R

myat = unique(c(seq(-0.1497458,0,length=6),seq(0,0.1665365,length=6))) 
     themes<- colorRampPalette((c("darkred", "red3","red","orange", "yellow","yellow4")))#(length(myat)-1) 

myColorkey <- list(at=myat,space = "bottom",labels=list(cex=1,font=1,at=myat),height=1,width=1) 
if (dev.cur() == 1) x11(width=4,height=4) 

#s <- stack(Precip_DJF,Precip_DJFsim) 
levelplot(Precip_DJFtmindiff, layout=c(1, 1), col.regions=themes, 
      colorkey=myColorkey,margin=FALSE,xlab=NULL,ylab=NULL,par.strip.text=list(cex=0),scales=list(x=list(draw=FALSE),y=list(draw=FALSE))) 

Результаты: enter image description here

Вопрос: Как я могу соответствовать значение 0 до желтого цвета, а затем поместить метки в цветовом ключе серединах разрывов вместо ребер? Мне нужно сокращение = 10.

Thanks, AT.

reproducible example here

ответ

2

В this book я обеспечиваю an example решить этот вопрос. Мой ответ в основном является копией части этого примера.

Потому что вы не обеспечиваете набор данных для воспроизведения кода я буду использовать файл, предложенный в книге:

library(rasterVis) 

setwd(tempdir()) 
myURL <-'https://github.com/oscarperpinan/spacetime-vis/raw/master/data/' 
download.file(paste0(myURL,'SISav.grd'), 'SISav.grd', method = 'wget') 
download.file(paste0(myURL,'SISav.gri'), 'SISav.gri', method = 'wget') 

SISav <- raster('SISav') 

Следующих строки определяют расходящуюся палитру:

meanRad <- cellStats(SISav, 'mean') 
SISav <- SISav - meanRad 
## Modify the palette with your colors 
divPal <- brewer.pal(n=9, 'PuOr') 
divPal[5] <- "#FFFFFF" 
divTheme <- rasterTheme(region=divPal) 

rng <- range(SISav[]) 
## Number of desired intervals 
nInt <- 15 
## Increment corresponding to the range and nInt 
inc0 <- diff(rng)/nInt 
## Number of intervals from the negative extreme to zero 
n0 <- floor(abs(rng[1])/inc0) 
## Update the increment adding 1/2 to position zero in the center of an interval 
inc <- abs(rng[1])/(n0 + 1/2) 
## Number of intervals from zero to the positive extreme 
n1 <- ceiling((rng[2]/inc - 1/2) + 1) 
## Collection of breaks 
breaks <- seq(rng[1], by=inc, length= n0 + 1 + n1) 
## Midpoints computed with the median of each interval 
idx <- findInterval(SISav[], breaks, rightmost.closed=TRUE) 
mids <- tapply(SISav[], idx, median) 
## Maximum of the absolute value both limits 
mx <- max(abs(breaks)) 
## Interpolating function that maps colors with [0, 1] 
## rgb(divRamp(0.5), maxColorValue=255) gives "#FFFFFF" (white) 
break2pal <- function(x, mx, pal){ 
    ## x = mx gives y = 1 
    ## x = 0 gives y = 0.5 
    y <- 1/2*(x/mx + 1) 
    rgb(pal(y), maxColorValue=255) 
} 
divRamp <- colorRamp(divPal) 
## Diverging palette where white is associated with the interval 
## containing the zero 
pal <- break2pal(mids, mx, divRamp) 

И, наконец levelplot отображает результат:

levelplot(SISav, par.settings=rasterTheme(region=pal), 
      at=breaks, contour=TRUE) 

levelplot

+0

Отличный участок! – jbaums

+0

Прохладный! Чтобы воспроизвести это, мне пришлось добавить библиотеку (rasterVis) 'после строк загрузки. Было бы неплохо, если бы это можно было сделать намного проще. –

+0

@ EdzerPebesma отредактирован. Благодарю. Я согласен, но я не мог найти более простой способ. Возможно, я включу его в код 'levelplot' в качестве дополнительной опции. –

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