¿Agregar una barra de escala a un mapa ggplot que se ha escalado usando coord_sf?

Aug 18 2020

Produje un mapa usando el paquete sf y ggplot2:

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) 
print(x)

que produce el siguiente mapa en Rstudio:

Eso es genial, pero necesito agregarle una barra de escala. Cuando intento modificar el código usando ggsn, no veo la barra de escala en absoluto.

library(ggplot2)
library(sf)
library(rnaturalearth)
state_prov <- rnaturalearth::ne_states(c("united states of america", "canada"), returnclass="sf")
x <- ggplot(data=state_prov) + 
geom_sf()+
coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
ggsn::scalebar(state_prov, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)
print(x) 

Intenté cambiar la altura, la lista de calles y la ubicación sin éxito. Puedo ver una barra de escala mal escalada cuando elimino la llamada a coord_sf (), lo que me hace creer que ggsn no reconoce que coord_sf () está haciendo zoom en el mapa.

¿Cómo puedo solucionar esto? ggsn no parece ser fácilmente modificable. Estoy abierto a usar otro paquete o método, pero necesito continuar llamando a ggplot de manera similar ya que tengo un mapa mucho más complicado basado en la misma estructura.

¡Gracias!

Respuestas

2 nniloc Aug 18 2020 at 07:33

Como mencionas, si comentas la coord_sfparte de tu código, aparecerá la barra de escala. Supongo que ggsn::scalebardebe obtener su topleftubicación de todo el conjunto de state_provdatos, y cuando hace zoom con coord_sfla barra de escala se recorta.

Editar: tenga cuidado con la distorsión extrema al colocar una barra de escala en un mapa con proyección lat / long en esta escala:https://stackoverflow.com/a/41373569/12400385

Aquí hay un par de opciones para que aparezca una barra de escala.

Opción 1

Use en ggspatial::annotation_scalelugar de lo ggsnque parece reconocer el zoom como se define en coord_sf.

ggplot(data=state_prov) + 
  geom_sf()+
  coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggspatial::annotation_scale(location = 'tl')

opcion 2

Utilice su código original pero recorte state_provantes de trazar para scalebarpoder encontrar el correcto topleft.

state_prov_crop <- st_crop(state_prov, xmin=-170, xmax = -95, ymin = 40, ymax = 75)

ggplot(data=state_prov_crop) + 
  geom_sf()+
  #coord_sf(xlim=c(-170, -95), ylim=c(40, 75)) +
  ggsn::scalebar(state_prov_crop, location="topleft", dist = 50, dist_unit = "km", 
                 transform=TRUE, model="WGS84", height=0.1)