2016-04-06 38 views
2

Wie kann ich mit den unten stehenden Beispieldaten Raster und räumliche Punkte mit der gleichen Farbe erzeugen wie im unten gezeigten "manuell" verbundenen Diagramm?Einzelnes Farbfeld für Raster und Punkte Levelplot R

library(rasterVis) 
library(raster) 
library(colorRamps) 
col=colorRampPalette(matlab.like2(255)) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

levelplot(s, margin=FALSE, at=seq(0, 1, 0.05),col.regions=col) 
x=xy$x;y=xy$y;z=xy$z1 

levelplot(z ~ x + y,contour=F, panel = panel.levelplot.points, 
      margin=FALSE,col.regions=col, 
      par.settings=list(axis.line=list(lwd=3), strip.border=list(lwd=3)), 
     cex=1.4, scales=list(x=list(cex=1.7),y=list(cex=1.7)),xlab=list(label="Longitude",cex=2), 
      ylab=list(label="Latitude",cex=2)) 

sample plot

Dank @fdestch ich in der Lage war, mit dem folgenden Plot zu generieren:

latticeCombineGrid(mget(rep("pp", 24)), layout = c(3, 8)) 

im Anschluss an meine Kommentare auf mehrere Plots mit den gleichen colorkey Druck.

Ein Thema, das geklärt werden, bleibt:

1) Wie kann man in der Größenordnung von Platten entscheiden? Das heißt, welche Zeile & Spalte, um ein bestimmtes Diagramm genau wie in 10 mit index.cond zu platzieren.

enter image description here

+0

Bitte posten Sie eine andere Frage für die letzte Ausgabe. –

Antwort

2

Zunächst einmal sollten Sie wahrscheinlich sicherstellen, dass die Pausen in den Punkten Grundstück mit denen in der ersten levelplot definiert identisch sind.

## raster plot with colorkey disabled 
pr <- levelplot(s, margin = FALSE, at = seq(0, 1, 0.05), col.regions = col, 
       colorkey = FALSE, xlab = list("Longitude", col = "transparent")) 

## points plot 
pp <- levelplot(z ~ x + y, panel = panel.levelplot.points, cex = 1.4, 
       contour = FALSE, margin = FALSE, col.regions = col, 
       colorkey = list(at = seq(0, 1, .05), width = .6, height = .6), 
       xlab = "Longitude", ylab = "Latitude") 

Bitte beachten Sie die Definition einer transparenten xlab wenn die Rasterdiagramm zu erstellen. Diese kleine Problemumgehung ist sehr praktisch, wenn Sie später downViewport verwenden, um sicherzustellen, dass sich die tatsächlichen Plot-Grenzen von und pp überlappen (fühlen Sie sich frei, grid.rect() direkt nach print(pr, newpage = FALSE) zu laufen, um zu sehen, was ich meine).

Die tatsächliche Plot-Anordnung kann dann einfach mithilfe von Ansichtsfenstern aus dem Grid--Paket erreicht werden.

library(grid) 
library(lattice) 

## initialize new grid device 
grid.newpage() 

## add raster plot 
vp1 <- viewport(x = 0, y = 0, width = .5, height = 1, 
       just = c("left", "bottom")) 

pushViewport(vp1) 
print(pr, newpage = FALSE) 

## add points plot 
downViewport(trellis.vpname("page")) 

vp2 <- viewport(x = 1, y = 0, width = .75, height = 1, 
       just = c("left", "bottom")) 
pushViewport(vp2) 
print(pp, newpage = FALSE) 

arranged_plots

+0

sehr schöne Lösung. Danke vielmals. Was ist, wenn ich 8 Zeilen und 3 Spalten mit einem einzelnen Farbschlüssel anzeigen lassen möchte? Normalerweise verwende ich 'layout = c (3, 8), index.cond = list (c (1,2, ....))', um mein Raster zu erhalten. 'Viewport' kann für das Arrangieren von Plots schwierig sein. Irgendwelche Workarounds für 'layout' und' index.cond'? – code123

+0

Zu diesem speziellen Zweck gibt es eine Funktion namens ['gitterCombineGrid'] (https://github.com/environmentalinformatics-marburg/Rsenal/blob/master/R/latticeCombineGrid.R) in unserem Paket ** Rsenal **. Installieren Sie das Paket einfach über 'devtools :: install_github (" environmentalinformatics-marburg/Rsenal ")' und führen Sie z. 'gitterCombineGrid (mget (rep (" pp ", 24)), Layout = c (3, 8))'. Beachten Sie, dass die Ergebnisse am besten aussehen, wenn alle Diagramme identische x- und y-Grenzen haben. – fdetsch

+0

hast du meinen Tag gerettet. 'gitterCombineGrid' sieht sehr vielversprechend aus. Ich werde es definitiv ausprobieren. Danke noch einmal. – code123

1

Hier ist meine Lösung mit latticeExtra::c.trellis:

library(raster) 
library(rasterVis) 

s <- stack(replicate(2, raster(matrix(runif(100), 10)))) 
xy <- data.frame(coordinates(sampleRandom(s, 10, sp=TRUE)), 
       z1=runif(10), z2=runif(10)) 

## Define theme and breaks 
myTheme <- BTCTheme() 
my.at <- seq(0, 1, 0.05) 
  • Plot der Raster* Objekt, mit rasterVis::levelplot:

    p1 <- levelplot(s, margin=FALSE, 
            at = my.at, 
            par.settings = myTheme) 
    
  • Plot die Punkte, mit lattice::levelplot:

    p2 <- levelplot(z1 ~ x + y, data = xy, 
            at = my.at, 
            panel = panel.levelplot.points, 
            par.settings = myTheme) 
    
  • Begleiten Sie sie mit latticeExtra::c.trellis:

    p3 <- c(p1, p2, layout = c(3, 1)) 
    
  • Leider hat c.trellis die Streifenetiketten nicht richtig zuordnen, damit Sie sie direkt definieren:

    update(p3, 
        strip = strip.custom(factor.levels = c(names(s), "Points"))) 
    

raster + points

+0

Dies ist noch einfacher und einfacher zu implementieren. Vielen Dank. Die letzte Zeile des Codes kann verwendet werden, um zu entscheiden, wo jedes Plot im Panel platziert wird. Wenn ich die Namen von 's' kenne, kann ich leicht entscheiden, in welcher Reihenfolge sie angezeigt werden sollen. – code123