2012-04-04 15 views
8

Ich habe 3 SHP-Dateien, die das Haus, Zimmer und Betten eines Hauses jeweils darstellen. Ich muss sie in einem Diagramm mit R so plotten, dass sie sich alle überlappen. Ich weiß, dass in plot Funktion kann ich line verwenden, um neue Zeilen auf dem vorhandenen Grundstück zu plotten, gibt es etwas Entsprechendes in spplot? Vielen Dank.plot mehrere shp-Datei auf einem Graph mit spplot in R

+0

Welchen Aspekt von spplot, den Sie nicht mit Basis-Plot tun können, brauchen Sie? Mit sp-Objekten plotten Sie einfach die erste und zeichnen dann mit add = TRUE, um die anderen zu überlagern. Warum bringen Sie spplot in den Mix? – Spacedman

Antwort

0

Sie das in spplotsp.layout Argument verwenden können. Alternativ können Sie ggplot2 verwenden. Einige Beispiel-Code (ungetestete):

library(ggplot2) 
shp1_data.frame = fortify(shp1) 
shp1_data.frame$id = "shp1" 
shp2_data.frame = fortify(shp2) 
shp2_data.frame$id = "shp2" 
shp = rbind(shp1_data.frame, shp2_data.frame) 

ggplot(aes(x = x, y = y, group = group, col = id), data = shp) + geom_path() 

In ggplot2, Spalten in den Daten werden an graphischen Skalen in der Handlung verknüpft. In diesem Fall ist x die x-Koordinate, y ist die y-Koordinate, group ist eine Spalte im data.frame shp, die angibt, zu welchem ​​Polygon ein Punkt gehört, und col ist die Farbe des Polygons. Die von mir verwendete Geometrie ist geom_path, die eine Reihe von Linien basierend auf dem Polygon-Eingabedatenrahmen zeichnet. Eine Alternative ist die Verwendung von geom_poly, die auch das Füllen des Polygons unterstützt.

17

Hier ist ein Ansatz, mit der geschickten layer() Funktion aus dem latticeExtra Paket:

# (1) Load required libraries 
library(sp) 
library(rgeos)  # For its readWKT() function 
library(latticeExtra) # For layer() 

# (2) Prepare some example data 
sp1 = readWKT("POLYGON((0 0,1 0,1 1,0 1,0 0))") 
sp2 = readWKT("POLYGON((0 1,0.5 1.5,1 1,0 1))") 
sp3 = readWKT("POLYGON((0.5 0,0.5 0.5,0.75 0.5,0.75 0, 0.5 0))") 

# spplot provides "Plot methods for spatial data with attributes", 
# so at least the first object plotted needs a (dummy) data.frame attached to it. 
spdf1 <- SpatialPolygonsDataFrame(sp1, data=data.frame(1), match.ID=1) 

# (3) Plot several layers in a single panel 
spplot(spdf1, xlim=c(-0.5, 2), ylim=c(-0.5, 2), 
     col.regions="grey90", colorkey=FALSE) + 
layer(sp.polygons(sp2, fill="saddlebrown")) + 
layer(sp.polygons(sp3, fill="yellow")) 

enter image description here

Alternativ können Sie das gleiche Ergebnis über spplot() ‚s sp.layout= Argument erreichen. (first=FALSE Angabe stellt sicher, dass das ‚Dach‘ und ‚Tür‘ nach/über dem graue Quadrat als spplot() s erstes Argument aufgetragen werden.)

spplot(spdf1, xlim=c(-0.5, 2), ylim=c(-0.5, 2), 
     col.regions="grey90", colorkey=FALSE, 
     sp.layout = list(list(sp2, fill="saddlebrown", first=FALSE), 
         list(sp3, fill="yellow", first=FALSE)))