2015-03-30 12 views
7

Czy można umieścić legendę spplot (wielokąty spplot) w obrębie mapy, w lewym dolnym rogu, w ten sposób?Niestandardowe umieszczenie legendy spplot na mapie

enter image description here

Najbliżej byłem w stanie dostać się to (nie jestem delegowania moich danych, tylko zamiast używać przykładowe dane, więc w tym przypadku, spróbuj umieścić legendę w górnej lewej części mapy):

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

Ale legenda jest w środku strony i jest poza mapy. Niestety, argument colorkey nie obsługuje argumentów "bottomleft" lub x, y lub rogu (patrz ?levelplot). Próbowałem również użyć argumentu key.space, ale wygląda na to, że działa tylko podczas drukowania SpatialPoints*, ale wydaje się być ignorowany dla SpatialPolygons* (lub SpatialPixelsDataFrame, jak w powyższym przykładzie).

Odpowiedz

9

Ponieważ klucz jest grobem, można go całkowicie wyodrębnić z obiektu z działki i narysować osobno tam, gdzie chcesz.

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! Dodałem go do przykładów spplot, jeśli nie masz nic przeciwko. –

+0

Wcale nie, cieszę się, że to lubisz! To trochę hack, ponieważ określa położenie klucza w jego środku w stosunku do rozmiaru obszaru fabuły, powodując jego dryfowanie z miejsca, jeśli liczba zostanie przeskalowana. Lepszym rozwiązaniem byłoby zdefiniowanie pozycji w lewym górnym rogu z absolutną odległością od granicy obszaru kreślenia, ale nie wiem, jak to zrobić niestety. – Backlin

+0

Dzięki Backlin !! Chciałem zapytać cię dokładnie o to - położenie względem narożnika. Czy nie ma takiej możliwości jak argument "rogu" z 'key.space'? – TMS

5

Problem komplikuje tutaj jest to, że chociaż colorkey= argumentem traktowany jest bardzo podobny do legend= argumentu, to nie dość wsparcie pełny zestaw opcji pozycjonowania że legend= robi. Podczas gdy legendy można umieścić bezpośrednio pod "left", "right", "top", "bottom" i "inside" działka, colorkey= obsługuje tylko pierwsze cztery z nich.

Dość czystym rozwiązaniem jest wyodrębnienie listy argumentów colorkey przygotowanej przez jedno połączenie do spplot() i przekazanie tego do drugiego wywołania spplot() za pośrednictwem jego argumentu legend=. colorkey= „wie” jak przygotować obiekt colorkey i legend= umie rysować dowolne obiekty wewnątrz działek, więc możemy połączyć dwa, aby dostać to, co chcemy:

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

Uwaga:colorkey= "Brak wsparcia dla opcji" wewnątrz "wydaje się być mniejszy niż wybór projektu, a nie tylko kwestia autorów pakietu, którzy jeszcze nie doszli do wdrożenia wymaganego kodu. Jako dowód, że można znaleźć w dokumentacji colorkey= w ?lattice::levelplot (do którego jest kierowany przez `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 
Powiązane problemy