sf to data.frame: warum as_Spatial vor as.data.frame benötigt wird

Nov 05 2020

Angenommen, ich möchte einem geom_sf () -Diagramm Beschriftungen hinzufügen, um Folgendes zu erhalten:

Ab November 2020 existiert die Methode nicht mehr, daher erhalte ich eine Warnung und nichts wird geplottet, wenn ich versuche:

library(sf)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
ggplot() +
  geom_sf(data = nc, aes(label = CNTY_ID))

 Warning message:
 Ignoring unknown aesthetics: label

Wenn ich versuche, Beschriftungen manuell über geom_text () hinzuzufügen , kann ich nicht herausfinden, wie ich von nc zu "nc2" wechseln kann, die ich in einem ggplot verwenden kann:

Wenn ich Folgendes versuche, ist die Ausgabe nicht wie erwartet:

nc2 <- nc %>% st_centroid() %>%        # ok, transform multypoligon to centroid
  as.data.frame()                      # does not return something useful, WHY ?

aber wenn ich es mache:

nc2 <- nc %>% st_centroid() %>%  
  as_Spatial() %>%                     # this is nonsense, why ?
  as.data.frame()

Mit den folgenden Angaben kann ich nun den ursprünglich gewünschten Plot mit den richtigen Beschriftungen erhalten.

ggplot() +
  geom_sf(data = nc) +
  geom_text(data=nc2, aes(coords.x1, coords.x2, label=CNTY_ID))

Was ist der empfohlene Weg von sf zu tibble / data.frame zu ggplot? Mir scheint, dies ist eine gewöhnliche Aufgabe, und zwei Schritte (as_Spatial () + as.data.frame ()) durchlaufen zu müssen, ist falsch.

Antworten

3 AllanCameron Nov 05 2020 at 06:45

Sie können stat_sf_coordinatesmit geom = "text"in ggplot verwenden. Sie müssen nicht einmal einen zweiten Datenrahmen erstellen. Sie können st_centroidals Parameter übergeben.

Das Folgende ist eigentlich ein vollständiger Reprex, der für alle funktionieren sollte, auf denen aktuelle Versionen von ggplot2 und sf installiert sind:

ggplot2::ggplot(sf::st_read(system.file("shape/nc.shp", package = "sf"))) +
  ggplot2::geom_sf() +
  ggplot2::stat_sf_coordinates(fun.geometry = sf::st_centroid,
                               ggplot2::aes(label = CNTY_ID), geom = "text")