Как перевернуть ось y в geom_sf ()?

Пытаюсь объединить geom_sf() с другими геометриями. Мне нужно перевернуть ось Y, чтобы график отображался правильно. Однако geom_sf(), похоже, игнорирует scale_y_reverse().

Пример:

# install the dev version of ggplot2
devtools::install_github("tidyverse/ggplot2")

library(ggplot2)
library(sf)
library(rgeos)
library(sp)

# make triangle
tmpdf <- data.frame(id = 1,
                    geom = c("LINESTRING(10 10,-10 10,0 0,10 10)"), stringsAsFactors = F)


# read WKT polygons into 'sp' SpatialPolygons object
tmpdf$spgeom <- lapply(tmpdf$geom, FUN = function(x) readWKT(x))

# extract coordinates from the linestring (there has got to be a better way to do this...)
test <- tmpdf[1,"spgeom"]
test2 <- sapply(test, FUN=function(x) x@lines)
test3 <- sapply(test2, FUN=function(x) x@Lines)
test4 <- lapply(test3, FUN=function(x) x@coords)

# plot the sp coordinates
ggplot() + 
  geom_point(data=data.frame(test4[[1]]), aes(x,y), color="blue") + 
  geom_path(data=data.frame(test4[[1]]), aes(x=x, y=y), color="blue") + 
  coord_fixed()

только ggplot sp geom

# make an 'sf' sfc_POLYGON object
tmpdf$sfgeom <- st_as_sfc(tmpdf$geom) 

## plot both together, they overlap
ggplot() + 
  geom_point(data=data.frame(test4[[1]]), aes(x,y), color="blue") + 
  geom_path(data=data.frame(test4[[1]]), aes(x=x, y=y), color="blue") + 
  coord_fixed() +  
  geom_sf(data=tmpdf, aes(geometry=sfgeom), color="red")

ggplot both geom

сюжетные выходы с предупреждением:

Система координат уже присутствует. Добавление новой системы координат, которая заменит существующую.

## plot with scale reverse, and everything but the geom_sf flips.
ggplot() + 
  geom_point(data=data.frame(test4[[1]]), aes(x,y), color="blue") + 
  geom_path(data=data.frame(test4[[1]]), aes(x=x, y=y), color="blue") + 
  coord_fixed() +  
  geom_sf(data=tmpdf, aes(geometry=sfgeom), color="red") + 
  scale_y_reverse()

ggplot y reversed

сюжетные выходы с предупреждением:

Система координат уже присутствует. Добавление новой системы координат, которая заменит существующую.

Предлагаете ли вы поменять местами координаты geom_sf y?

Я пробовал это:

coord_sf(ylim=-(range(st_coordinates(tmpdf$sfgeom)[,"Y"])))

и все, что мне удалось сделать, это изменить ось, а не реальную геометрию.


person Brian D    schedule 04.12.2018    source источник
comment
Не уверен, но похоже, что geom_sf может принимать только один вид координат (ggplot2.tidyverse.org/ ссылка / stat_sf_coordinates.html). Для меня это означает, что вы не можете перевернуть его или перевернуть (ссылка на Мисси Эллиот не предназначена).   -  person Ben G    schedule 04.12.2018
comment
га. Итак, я искал функции st_ *, которые позволили бы мне изменить координаты y. наверное нужен установщик координат. следующее не работает: st_coordinates(tmpdf$sfgeom)[,"Y"] = st_coordinates(tmpdf$sfgeom)[,"Y"]*-1   -  person Brian D    schedule 05.12.2018
comment
Не по теме, а в чем смысл этого геома и зачем его использовать?   -  person Ben G    schedule 05.12.2018
comment
ggplot2.tidyverse.org/reference/ggsf.html визуализация пространственных объектов объектов. например, из пространственной базы данных, шейп-файла и т. д.   -  person Brian D    schedule 05.12.2018


Ответы (1)


Ага! Вот обходной путь:

## get the geom coordinates as data.frame
geomdf <- st_coordinates(tmpdf$sfgeom)

## reverse Y coords
geomdf[,"Y"] <- geomdf[,"Y"]*-1

## re-create geom
tmpdf$sfgeom2 <- st_as_sfc(st_as_text(st_linestring(geomdf)))

## plot the reversed y-coordinate geom:
ggplot() + 
  geom_point(data=data.frame(test4[[1]]), aes(x,y), color="blue") + 
  geom_path(data=data.frame(test4[[1]]), aes(x=x, y=y), color="blue") + 
  coord_fixed() +  
  geom_sf(data=tmpdf, aes(geometry=sfgeom2), color="red") + 
  scale_y_reverse()
person Brian D    schedule 04.12.2018