2016-06-16 37 views
1

Ist es möglich, den Schlüssel für z. B. eine sp.points-Ebene zu dem von levelplot generierten Farbschlüssel hinzuzufügen?Hinzufügen von sp.points-Schlüssel zu levelplot colorkey

Nehmen Sie das folgende Beispiel:

library(rasterVis) 
library(latticeExtra) 
library(sp) 

r <- as.factor(raster(matrix(rbinom(100, 1, 0.5), 10))) 
levels(r)[[1]] <- data.frame(ID=0:1, z=c('a', 'b')) 
p <- SpatialPoints(matrix(runif(20), 10)) 

levelplot(r, margin=list(draw=FALSE), scales=list(draw=FALSE), 
      col.regions=c('white', 'gray90')) + 
    latticeExtra::layer(sp.points(p, pch=20, col=1)) 

enter image description here

Ich möchte eine Tasteneingabe für die Punkte an, unter dem bestehenden colorkey.

A kludgy Lösung ist, einen Schlüssel zum levelplot Anruf hinzuzufügen, wie folgt, die x und y Werte eingestellt, bis sie in der gewünschten Position ist, aber (1) Finden der richtigen x und y Werte ist ein Schmerz, erfordert Interaktion, (2) die rechte Auffüllung wird nicht angepasst, um den Schlüssel aufzunehmen, und (3) die Schriftgröße wird nicht automatisch skaliert, um mit der Farbe übereinzustimmen.

k <- list(x = 1.02, y = 0.4, corner = c(0, 0), points=list(pch=20, col=1), 
      text=list('foo', cex=0.9)) 

levelplot(r, margin=list(draw=FALSE), scales=list(draw=FALSE), 
      col.regions=c('white', 'gray90'), key=k) + 
    latticeExtra::layer(sp.points(p, pch=20, col=1)) 

enter image description here

Angenommen, ich mit lattice Grafiken haften müssen, was ist der beste Weg, um die Probleme zu überwinden, die ich oben aufgeführt?

Antwort

1

Obwohl es nicht alle Probleme löst Sie angesprochen, vielleicht die latticeExtra::mergedTrellisLegendGrob Funktion ist nützlich für Sie:

p1 <- levelplot(r, scales=list(draw=FALSE), 
       col.regions=c('white', 'gray90')) 

myPoints <- SpatialPoints(matrix(runif(20), 10)) 
p2 <- spplot(myPoints, pch=20) 

## Merge graphics 
p <- p1 + p2 

## Merge legends 
l1 <- p1$legend$right 
l2 <- p2$legend$bottom 
ll <- mergedTrellisLegendGrob(l1, l2) 
p$legend$right$fun <- ll 

p 

mergedLegends

+0

Dank Oscar. Ist es möglich, die 'p2'-Legende in Übereinstimmung mit dem levelplot-Schlüssel (d. H. Über oder unter, anstatt neben) zu haben? – jbaums

+1

Sie sollten das Argument 'vertical' in' mergedTrellisLegendGrob' versuchen. Der Standardwert ist 'FALSE' (wie in diesem Beispiel). Beim Erforschen des Codes habe ich herausgefunden, dass mit 'vertical = TRUE' diese Funktion' packGrob' verwendet, um die erste Legende oben und die zweite unten zu platzieren. Vielleicht ist das nicht genau das, was du brauchst. Stattdessen können Sie die letzten Zeilen dieser Funktion mit den 'row'- und' col'-Argumenten von 'packGrob' wiederverwenden. –