2016-03-30 23 views
4

İki tane raster katmanım var, biri gri tonlamalı bir görüntü ve bir analizden elde edilen diğer sonuçlar. Ggplot'ta gri tonlamalı arka plan olarak bir raster kullanmak ve bir renk rampası kullanarak ikinci rasterin yerleştirilmesini istiyorum.R - ggplot2 - raster'i greyscale basemap olarak kullan

enter image description here

Ben raster ayrı renkler atanamıyor: Bu benziyor nasıl örnek (ama daha güzel) 'dir. Bunu başarmanın bir yolunu biliyor musun? Uzun zamandır googledim ve bunun mümkün olmadığına inanıyorum. Ama inanamıyorum (ve istemiyorum).

Daha fazla bilgi için lütfen bize bildirin.

Örnek

oluşturmak test verileri

xy.1 <- expand.grid(1:10, 1:10) 
df.1 <- data.frame(Longitude=xy.1[,1], Latitude=xy.1[,2], Value=xy.1[,1]+xy.1[,2]) 
xy.2 <- expand.grid(3:5, 3:5) 
df.2 <- data.frame(Longitude=xy.2[,1], Latitude=xy.2[,2], Value=rnorm(9)) 

arsa

p1 <- ggplot() + 
    geom_raster(data=df.1, aes(x=Longitude, y=Latitude, fill=Value)) + 
    scale_fill_gradientn(colours = grey(seq(0,1,l=20))) + 
    coord_equal() + 
    theme(legend.position="none") 

p1 + geom_raster(data=df.2, aes(x=Longitude, y=Latitude, fill=Value)) + 
    scale_fill_gradient(low="red", high="white") 

Sonuç:

enter image description here

+2

hayal meyal de bu yapmaya çalışıyor ve bu tasarımdan kaçınılmalıdır edildiğini Googling anımsıyorum: – fanli

+0

Teşekkür Fanli Cevabınız için https://github.com/hadley/ggplot2/issues/578. Bağlantıyı kontrol ettim ve son yorumda ggvis'in bunu desteklediği belirtiliyor. Bunu ggvis ile yapmaya çalışacağım ve eğer işe yararsa cevabı göndereceğim. – basil

+0

Ben ggvis bir göz attıktan sonra bu yanlış bir yaklaşım olduğunu düşünüyorum. – basil

cevap

2

Bir arka plan eklemeyi ve ggplot2'yi kullanarak bir ön plan rasterini oluşturmayı sağlayan bir işlev yazdım.

Düzenleme:

İki rasterları birleştirmek ve değerleri vardiya, değerler örtüşmeyen şekilde: Ben Bu nasıl çalıştığını olduğu uca

daha iyi bir çözüm eklendi. Ardından, raster katmanını ön plan için renk skalasını içeren bir ölçek çubuğu ile çiziyorum (örneğin, kırmızı -> yeşil), burada arka plan renk skalası kodlanmış (siyah -> beyaz). Renk sayısında bir sınır yoktur.

Tarama katmanının efsanesi görüntülenmiyor. Tüm ölçek çubuğunu (siyah - beyaz -> kırmızı -> yeşil) içermeyen bir efsane elde etmek için arka plana iki kukla puan ekliyorum. Ön plan verilerinin en küçük olanı, biri en büyük olanıdır. Bu sadece ön plan verileri için bir efsane verir.

Birisi ölçeklemeyi ve renk ölçeğini oluşturmanın daha iyi bir yolunu biliyorsa, bunu işleve eklemekten memnuniyet duyarız.

Önplan verileri nicel kullanarak ölçekleme olanağını ekledim; fg.quant argümanı, verileri "kesmek" için kullanılan iki tam sayıya sahip bir vektör alır. bw.scale, arka plan rasterinin daha koyu/parlak olmasını sağlar: bw.scale=c(0, 0.5), arka plan görüntüsünün örneğin siyahtan griye (0,5) kadar bir renk skalasına sahip olduğu anlamına gelir.

Bunun mükemmel bir işlev olmadığını biliyorum. Ama benim için çok faydalı ve ben bunu geliştireceğim ve boş zamanlarım olduğunda çirkin parçaları ortadan kaldırmaya çalışacağım.

test verisi

# 'background' 
r.1 <- raster(x=matrix(rowSums(expand.grid(1:10, 1:10)), nrow=10), 
       xmn=0, xmx=10, ymn=0, ymx=10) 
# 'foreground' 
r.2 <- raster(x=matrix(rnorm(16), nrow=4), 
       xmn=3, xmx=7, ymn=3, ymx=7) 

arsa fonksiyonu

#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
# BGPlot() -- plot data with background raster using ggplot2 
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

BGPlot <- function(fg, 
        bg, 
        cols=c('red', 'green'), 
        fg.quant=c(0, 1), 
        bw.scale=c(0, 1), 
        plot.title='', 
        leg.name='Value') { 
    # plot data with background raster using ggplot2 
    # 
    # Args 
    # fg: foreground raster layer 
    # bg: background raster layer 
    # cols: colors to use for fg 
    # fg.quant: scaling fg by quantiles 
    # bw.scale: makes bg darker/brighter: 
    #  E.g. c(0, 0.9) -> darker/c(0.2, 1) -> brighter 
    # plot.title: title 
    # leg.name: name to be displyed at legend 
    # 
    # Returns 
    # ggplot object 

    # load libraries 
    library(ggplot2) 

    # get min/max of foreground raster 
    fg.q <- quantile(fg, fg.quant) 
    fg.min <- fg.q[1] 
    fg.max <- fg.q[2] 

    # rescale fg 
    fg.sc <- (fg-fg.q[1])/(fg.q[2]-fg.q[1]) 
    fg.sc[fg.sc<0] <- 0 
    fg.sc[fg.sc>1] <- 1 
    fg.sc <- fg.sc + 0.1 

    # get scale (fg values 0.1, 10, 1000 range?) 
    ifelse((fg.max-fg.min)/10>=1, n.dgts <- 0, n.dgts <- 1) 

    # create fg legend breaks/labels 
    fg.breaks <- round(seq(fg.min, fg.max, l=5), n.dgts) 
    fg.breaks[1] <- ceiling(fg.min*(10^n.dgts))/(10^n.dgts) 
    fg.breaks[5] <- floor(fg.max*(10^n.dgts))/(10^n.dgts) 

    fg.labs <- paste0(c(paste0(round(fg.min, n.dgts+1), '-'),'','','',''), 
        fg.breaks, 
        c('','','','',paste0('-', round(fg.max, n.dgts+1))) 
) 


    # rescale bg 
    bg.sc <- (bg-minValue(bg))/
    (maxValue(bg)-minValue(bg)) * 
    (bw.scale[2]-bw.scale[1]) + bw.scale[1] -1.1 


    # merge rasters, fg over bg 
    r <- merge(fg.sc, bg.sc) 

    # convert raster to data.frame 
    r.df <- as.data.frame(rasterToPoints(r)) 
    names(r.df) <- c('Longitude', 'Latitude', 'Value') 

    # get center of r 
    mid.Lon <- mean(r.df$Longitude) 
    mid.Lat <- mean(r.df$Latitude) 

    # set scale positions 
    vals <-c(-1.1,-0.1, seq(0.1,1.1,l=length(cols))) 

    # set dummy-point values 
    dp <-seq(fg.min,fg.max,l=length(cols)) 


    # plotting; 
    p <- 
    ggplot() + 
    # dummy points: points not visible, needed to display custom scale-bar 
    geom_point(data=data.frame(x = rep(mid.Lon, length(cols)), 
           y = rep(mid.Lat, length(cols)), 
           c = dp), 
       aes(x, y, color=c)) + 
    scale_color_gradientn(colours = cols, 
          breaks=fg.breaks, 
          labels=fg.labs, 
          name=leg.name) + 
    # raster; no scale-bar plotted 
    geom_raster(data=r.df, aes(x=Longitude, y=Latitude, fill=Value)) + 
    scale_fill_gradientn(colours = c('black', 'white', cols), 
         values = vals, 
         rescaler = function(x,...) x, 
         oob  = identity, 
         guide = "none") + 
    ggtitle(label=plot.title) + 
    theme_light() + 
    labs(list(x='Lon', y='Lat')) + 
    theme(axis.text.y=element_text(angle=90, hjust=0.5)) + 
    coord_equal() 

    return(p) 
} 

işlev çağrısı

BGPlot(fg=r.2, bg=r.1, cols=c('red', 'green'), fg.quant=c(0.01, 0.99), bw.scale=c(0, 0.8), plot.title='Chlorophyll Concentration', leg.name='CHL') 

enter image description here

Bir "gerçek dünya" örnek:

enter image description here

DÜZENLEME: Daha iyi bir çözüm R paketini kullanarak 'RStoolbox'

Bu paket kullanarak çok kolay ve mükemmel çalışma çözümdür RStoolbox. ggR işlevi, gri tonlamalı bir arka plan görüntüsü, işlevi bir RGB arka planı olan ggRGB üretir.

library(ggplot2) 
library(RStoolbox) 
ggR(BACKGROUND_IMAGE, geom_raster=FALSE) + 
geom_raster(...) # here comes standard raster plot