sf в data.frame: зачем as_Spatial нужен перед as.data.frame

Nov 05 2020

Допустим, я хочу добавить метки к графику geom_sf (), чтобы получить следующее:

по состоянию на ноябрь 2020 года этот метод не существует, поэтому я получаю предупреждение, и при попытке ничего не отображается:

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

При попытке добавить ярлыки вручную через geom_text () я не могу понять, как перейти от nc к «nc2», который я могу использовать в ggplot:

Если я попробую следующее, результат будет не таким, как ожидалось:

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

но если я это сделаю:

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

Теперь, используя следующее, я могу получить изначально желаемый сюжет с соответствующими метками.

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

Каков рекомендуемый способ перехода от sf к tibble / data.frame к ggplot? Мне кажется, это обычная задача, и выполнение двух шагов (as_Spatial () + as.data.frame ()) неверно.

Ответы

3 AllanCameron Nov 05 2020 at 06:45

Вы можете использовать stat_sf_coordinatesс geom = "text"в ggplot. Вам даже не нужно создавать второй фрейм данных; вы можете передать st_centroidв качестве параметра.

На самом деле, это полное представление, которое должно работать для всех, у кого установлены последние версии ggplot2 и sf:

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")