2016-06-06 7 views
3

Es gibt questions da draußen über die Tatsache, dass ggplot2 nicht Polygonformen, die Löcher haben plotten können.Plot ggplot Polygone mit Löchern mit geom_polygon

Dies ist, weil, wenn die Reihenfolge der Punkte nicht OK ist, das Ende Diagramm schlecht aussieht, in der Regel mit Clipping/Trimmen Linien innerhalb der Donut-Form.

Ich habe viel darüber gelesen, wie wichtig die Reihenfolge ist, aber ich kann nicht vortreten. Ich habe eine SpatialPolygonsDataFrame mit 26 Funktionen (kommt von) und ich möchte es mit ggplot plotten.

Hier ist, was passiert -

r3.pol <- rasterToPolygons(r3, dissolve=T) 
r3.df <- fortify(r3.pol) 
names(r3.df) <- c('x','y','order','hole','piece','ID','group') 
p <- ggplot(r3.df) 
p <- p + geom_polygon(mapping=aes(x=x,y=y,group=ID), fill='red') 
p <- p + coord_equal() 

Ich sehe diese Ausgabe:

enter image description here

Während es wie so mit plot(r3.pol) sein sollte:

enter image description here

Wie kann Ich bin ake diese Arbeit? Ich habe stundenlang versucht, aber ich bin nicht in der Lage, r3.df neu zu ordnen. Kann auch die Information in r3.df$hole hilfreich sein? Es wird von der Funktion fortify für Punkte zurückgegeben, die Löcher sind (glaube ich).

Side Frage: Wie kann ich Ihnen meine r3.pol SpatialPolygonsDataFrame geben, so dass Sie es selbst versuchen können? Ich erinnere mich an lange, reproduzierbare "Dumps" von Objekten hier, aber ich weiß nicht, wie ich das machen soll.

I save d die Polygone Datenrahmen here. Ich konnte es nicht mit dput speichern, sorry. Sie können es mit load abrufen.

+1

Sie müssen nicht den gesamten Datenrahmen angeben. Nur eine kleinere Probe mit ein paar separaten Polygonen. Fügen Sie in Ihre Frage die Ausgabe von 'dput (dataSample)' ein. – eipi10

+0

@ eipi10 Das war es! Aber ich habe Probleme damit. Es scheint nicht auf einem SpatialPolygonsDataFrame zu funktionieren. Und wenn ich es auf r3.df verwende, sogar mit Subsampling, ist es immer noch ein riesiger Dump. Ich denke, ich werde dort einen Log-Anbieter verwenden. – natario

+0

Ich würde sagen, ditch ggplot2 für Karten und Paket verwenden: tmap - behandelt Löcher, nicht mehr alles zu "verstärken". – Spacedman

Antwort

2

Meine temporäre Lösung ist: @ # $% Polygone, und verwenden Sie das raster Paket.

Nämlich:

r <- raster(x=extent(r3.pol), crs=crs(r3.pol)) # empty raster from r3.pol 
res(r) <- 250 # set a decent resolution (depends on your extent) 
r <- setValues(r, 1) # fill r with ones 
r <- mask(r, r3.pol) # clip r with the shape polygons 

Und jetzt ist es plotten wie bei jeder anderen raster mit ggplot tun würde. Das rasterVis Paket kommen könnte hier hilfreich, aber ich bin es nicht verwenden, so:

rdf <- data.frame(rasterToPoints(r)) 
p <- ggplot(rdf) + geom_raster(mapping=aes(x=x, y=y), fill='red') 
p <- p + coord_equal() 

Und hier geht es.

enter image description here

Alternativ können Sie das Raster mit rasterize, schaffen so das Raster werden die Polygone Werte (in meinem Fall nur eine ganze Zahl) halten:

r <- raster(x=extent(r3.pol), crs=crs(r3.pol)) 
res(r) <- 250 
r <- rasterize(r3.pol, r) 

rdf <- data.frame(rasterToPoints(r)) 
p <- ggplot(rdf) + geom_raster(mapping=aes(x=x, y=y, fill=factor(layer))) 
p <- p + coord_equal() 

enter image description here

Wenn jemand kommt mit einer anständigen Lösung für geom_polygon, wahrscheinlich mit Neuordnung der Polygons Datenrahmen, ich werde froh sein, darüber nachzudenken.

1

Ich empfehle das Paket "ggpolypath" zu installieren und geom_polypath anstelle von geom_polygon zu verwenden. Funktioniert bei mir.