2015-03-30 9 views
7

Ist es möglich, die spplot (spplot Polygone) Legende in die Karte in der linken unteren Ecke, wie dies?Benutzerdefiniertes Platzieren von spplot Legende in der Karte

enter image description here

Die nächstgelegene ich habe in der Lage zu bekommen, ist dies (ich meine Daten nicht veröffentlichen, verwende ich nur die Beispieldaten statt, so in diesem Fall versuchen, die Legende in der linken oberen Teil zu platzieren von der Karte):

data(meuse.grid) 
gridded(meuse.grid)=~x+y 
spplot(meuse.grid[,'dist'], 
    colorkey = list(space = "left", height = 0.5) 
) 

Aber die Legende ist in der Mitte der Seite und ist außerhalb der Karte. Leider unterstützt das colorkey Argument nicht "bottomleft" oder x, y oder Eckargumente (siehe ?levelplot). Ich habe auch versucht, key.space Argument zu verwenden, aber es scheint nur beim Plotten SpatialPoints* zu funktionieren, aber es scheint ignoriert für SpatialPolygons* (oder SpatialPixelsDataFrame wie im obigen Beispiel).

Antwort

9

Da der Schlüssel ein eigener Grob ist, ist es durchaus möglich, ihn aus dem Plot-Objekt zu extrahieren und separat zu zeichnen, wo immer Sie möchten.

library(grid) 

# Separate plot and key 
s <- spplot(meuse.grid[,'dist'], 
    colorkey = list(space = "left", height = 0.5) 
) 
key <- draw.colorkey(s$legend[[1]]$args$key) 
s$legend <- NULL # Otherwise we'd get two keys 

# Modify key 
key$framevp$x <- unit(0.15, "npc") 
key$framevp$y <- unit(0.68, "npc") 

# Plot 
s 
grid.draw(key) 

enter image description here

+3

Nice! Ich habe es zu den spplot-Beispielen hinzugefügt, wenn es Ihnen nichts ausmacht. –

+0

Überhaupt nicht, froh, dass es Ihnen gefällt! Es ist jedoch ein bisschen wie ein Hack, da es die Position des Schlüssels um seine Mitte relativ zur Größe des Diagrammbereichs definiert, was dazu führt, dass es bei einer Neuskalierung der Abbildung verrutscht. Eine bessere Lösung wäre, die Position in der oberen linken Ecke mit einem absoluten Abstand zum Rand des Diagrammbereichs zu definieren, aber ich weiß leider nicht, wie ich das machen soll. – Backlin

+0

Danke Backlin !! Ich wollte dich genau danach fragen - die Positionierung relativ zur oberen Ecke. Gibt es eine Möglichkeit wie das 'corner' Argument von' key.space'? – TMS

5

Das Komplikations hier Problem ist, dass, obwohl das colorkey= Argument sehr ähnlich wie das legend= Argument behandelt wird, ist es nicht ganz Unterstützung die vollständige Suite von Positionierungsmöglichkeiten, die legend= tun. Während Legenden direkt unter "left", "right", "top", "bottom" und "inside" plaziert werden können, unterstützt die graphische Darstellung colorkey= nur die ersten vier davon.

A ziemlich sauber Abhilfe ist die colorkey Argumentliste von einem Aufruf von spplot() vorbereitet zu extrahieren, und das über sein legend= Argument zu einem zweiten spplot() Aufruf passiert in. colorkey= „weiß“, wie ein colorkey Objekt vorzubereiten und legend= weiß, wie innerhalb von Plots beliebige Objekte zu zeichnen, so können wir die beiden bekommen kombinieren, was wir wollen:

library(sp) 
library(grid) 
library(lattice) 
data(meuse.grid) 
gridded(meuse.grid)=~x+y 

## Call spplot() once as a way to construct a list of arguments 
## to draw.color.key 
SP <- spplot(meuse.grid[,'dist'], 
    colorkey = list(space = "left", height = 0.4) 
) 
args <- SP$legend$left$args$key 

## Prepare list of arguments needed by `legend=` argument (as described in ?xyplot) 
legendArgs <- list(fun = draw.colorkey, 
        args = list(key = args), 
        corner = c(0.05,.75)) 

## Call spplot() again, this time passing in to legend the arguments 
## needed to print a color key 
spplot(meuse.grid[,'dist'], colorkey = FALSE, 
     legend = list(inside = legendArgs)) 

enter image description here

Hinweis:colorkey= mangelnde Unterstützung für eine "Inside" -Option scheint weniger eine Design-Wahl als nur eine Frage der Paket-Autoren 'noch nicht um die Umsetzung der erforderlichen Code zu bekommen. Als Beweis, dass Sie in der Dokumentation für colorkey= in ?lattice::levelplot (zu denen eine unter der Regie von `sp :: spplot?):

colorkey: logical specifying whether a color key is to be drawn 
      alongside the plot, or a list describing the color key. The 
      list may contain the following components: 

      ‘space’: location of the colorkey, can be one of ‘"left"’, 
       ‘"right"’, ‘"top"’ and ‘"bottom"’. Defaults to 
       ‘"right"’. 

      ‘x’, ‘y’: location, currently unused 

      ‘corner’: Interacts with x, y; currently unimplemented 
Verwandte Themen