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
Antwort
Sie das in spplot
sp.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.
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"))
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)))
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