2015-01-21 2 views
0

그라디언트 색상으로 래스터 레이어 (b1_mosaic_diff)를 그려야합니다. 네거티브 값은 노란색에서 빨간색으로, 양수는 밝은 파란색에서 진한 파란색으로 바뀌어야합니다. 대신 그라데이션 빨간색의ggplot2가없는 스택의 그 레이디 언트 색상

내가 불행하게도 밖으로 작동하지 않는 코드 샘플이 (내가 그라데이션 푸른 위해 topo.colors과 동일한 heat.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

스틱,하지만 일반적으로 두 보완 colourRampPalette의의 각각 n (예 : 1000) 색상을 생성하는 (예 : 빨강/노랑 및 파랑 중 하나 에스). 그 후 색상 키의 길이가 양쪽 모두 짝수가 아닌 경우 색상 키의 더 짧은 부분에 해당하는 색상 벡터를 키의 긴 쪽의 비율로 길이에 따라 하위 집합으로 지정합니다. 아래 예제를 참조하십시오). 마지막으로 두 색상 벡터를 연결하여 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)에 걸쳐 있기를 원합니다. 따라서 색상 키의 짧은 부분에 사용할 색상 벡터를 하위 세트로 사용해야합니다 (음수, 즉 빨강). 정확히 말하자면, 키의 <0 부분이 >0 부분의 길이의 절반이기 때문에 빨간색 벡터의 처음 500 개 값을 삭제하려고합니다. 이것은 우리에게 500 오렌지 - 노랑색의 벡터 (빨강의 가장 붉은 색을 내렸음)와 1000 개의 블루스 벡터를 남겨 둡니다.

    cols <- c(colorRampPalette(rev(brewer.pal(9, 'YlOrRd')))(1000)[501:1000], 
          colorRampPalette(brewer.pal(9, 'Blues'))(1000)) 
    
  3. 플롯 raster 객체 일반 플롯 방법보다 좀 더 유연 levelplot와 래스터. 우리는 편의상 처음에 상한 및 하한 (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. 보너스 운동!다른 램프로,

    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

    나 : 예를 들어

    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)]) 
    } 
    

    :

    벡터 하위 설정을 자동화하기 위해 다음과 같은 기능을 사용할 수 있습니다

    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