2012-10-13 6 views
7

Ich habe eine Reihe von Daten, die ich auf Kreisebene geplottet habe, without borders. Ich möchte gerne Staatsgrenzen hinzufügen. Ich habe ein Zustands-Shapefile (Polygone), aber spplot scheint keine Möglichkeit zu haben, oben auf der vorherigen Karte hinzuzufügen. Gibt es eine Möglichkeit, dies zu tun, ohne die Panel-Funktion neu zu schreiben, um zwei SPDFs zu nehmen (was ziemlich speziell für das aussieht, was wahrscheinlich ein Problem anderer Leute ist)?Überlagern von zwei SpatialPolygonsDataFrames mit spplot

Hier ist ein reproduzierbares Beispiel:

library(sp) 
Srs1 = Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "s1") 
Srs2 = Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "s2") 

county <- SpatialPolygonsDataFrame(SpatialPolygons(list(Srs1,Srs2)), 
            data.frame(z=1:2, row.names=c("s1","s2"))) 

SrsA <- Polygons(list(Polygon(cbind(c(3,5,5,1,3),c(3,4,6,5,3)))),"sA") 
state <- SpatialPolygonsDataFrame(SpatialPolygons(list(SrsA)), 
            data.frame(z=1,row.names="sA")) 

spplot(county, zcol="z",col=NA) 
spplot(state, add=TRUE) # Note the add=TRUE does nothing here, but that's the spirit of what I want to accomplish 
+0

ich nur Basis Grafiken verwenden würde: Grundstück (foo, col = ...) und dann addiere = TRUE funktioniert und du kannst die Farben besser kontrollieren. Standard-spplot-Farben sind nicht gut für Polygone (Weiß-auf-Weiß ist nie eine gute Idee). – Spacedman

+0

@Spacedman Ich habe 'col.regions = grey (...)' verwendet. Ich schätze, der Punkt ist genommen und ich werde zu Basisgrafiken oder ggplot gehen und Gitter reservieren, wenn ich exploratorische trellisierte Visualisierungen benötige. Es bedeutet einfach viel mehr 'cut'ting und' legende', die ich versuche wo möglich zu vermeiden. –

Antwort

10

Um overplot die spplot Funktion verwenden, können Sie das sp.layout Argument verwenden. Erstellen Sie zum Beispiel Listen der entsprechenden Layout-Elemente, wie

spCounty <- list("sp.polygons", county, col = NA) 
spState <- list("sp.polygons", state) 

Dann Grundstück, die oben genannten Listenelemente als Liste auf das Argument sp.layout vorbei:

# spplot(county, zcol = "z", col = NA, sp.layout = list(spCounty, spState)) 
# actually, you only need to pass the second layout item to sp.layout 
spplot(county, zcol = "z", col = NA, sp.layout = spState) 

x- und y-Grenzen könnten nicht korrekt sein, wenn sich die beiden räumlichen Datenrahmen nicht vollständig überlappen. Sie können dies korrigieren dann erforderlich, wenn durch die entsprechenden Grenzen von bbox(obj)

Zum Beispiel Extrahieren

theMin <- pmin(bbox(county)[,1], bbox(state)[,1]) 
theMax <- pmax(bbox(county)[,2], bbox(state)[,2]) 

spplot(county, zcol = "z", col = NA, sp.layout = spState, 
    ylim = c(theMin[2], theMax[2]), xlim = c(theMin[1], theMax[1])) 

enter image description here

Verwandte Themen