2012-10-13 9 views
7

Mam kilka danych, które zostały wykreślone na poziomie powiatu, without borders. Chciałbym dodać granice stanu. Mam plik kształtu stanu (wielokątów), ale wydaje się, że nie ma żadnego sposobu dodania go na poprzedniej mapie. Czy jest jakiś sposób, aby to zrobić bez przepisywania funkcji panelu, aby wziąć dwa SPDF (co wydaje się dość wyspecjalizowane, co jest prawdopodobnie problemem, z którym mają do czynienia inni ludzie)?Overplotting dwie SpatialPolygonsDataFrames z spplot

Oto powtarzalne przykład:

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

bym po prostu użyć grafiki Base: działka (foo, col = ...) i następnie dodaj = TRUE działa i możesz lepiej kontrolować kolory. Domyślne kolory spplot nie są dobre dla wielokątów (biały-biały nigdy nie jest dobrym pomysłem). – Spacedman

+0

@Spacedman Używam 'col.regions = gray (...)'. Domyślam się, że punkt jest brany, a ja przejdę do grafiki bazowej lub ggplota i rezerwy kratki, kiedy potrzebuję odkrywczych kratowych wizualizacji. Oznacza po prostu dużo więcej 'cut'ting i' legend'ing, których staram się unikać tam, gdzie to możliwe. –

Odpowiedz

10

Aby overplot użyciu funkcji spplot, można użyć sp.layout argument. Na przykład, tworzenie list odpowiednich elementów układu, takich jak

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

Następnie działkę, przekazując powyższe elementy listy w postaci listy do sp.layout argumentu:

# 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 i Y limity nie może poprawne, jeśli te dwie przestrzenne dane.rame nie pokrywają się całkowicie. Można to skorygować w razie potrzeby poprzez ekstrakcję odpowiednich limitów z bbox(obj)

Na przykład

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