¿Agregar una barra de escala a un mapa ggplot que se ha escalado usando coord_sf?
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
Como mencionas, si comentas la coord_sf
parte de tu código, aparecerá la barra de escala. Supongo que ggsn::scalebar
debe obtener su topleft
ubicación de todo el conjunto de state_prov
datos, y cuando hace zoom con coord_sf
la 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_scale
lugar de lo ggsn
que 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_prov
antes de trazar para scalebar
poder 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)
