Ajouter une barre d'échelle à une carte ggplot qui a été mise à l'échelle à l'aide de coord_sf?

Aug 18 2020

J'ai produit une carte en utilisant le package sf et 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)

qui produit la carte suivante dans Rstudio:

C'est génial, mais je dois y ajouter une barre d'échelle. Lorsque j'essaye de modifier le code en utilisant ggsn, je ne vois pas du tout la barre d'échelle.

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) 

J'ai essayé de changer la hauteur, la st.dist et l'emplacement sans succès. Je peux voir une barre d'échelle mal mise à l'échelle lorsque je supprime l'appel à coord_sf (), ce qui me fait croire que ggsn ne reconnaît pas que la carte est agrandie par coord_sf ().

Comment puis-je réparer ça? ggsn ne semble pas être facilement modifiable. Je suis ouvert à l'utilisation d'un autre package ou méthode, mais je dois continuer d'appeler ggplot de la même manière car j'ai une carte beaucoup plus compliquée basée sur la même structure.

Merci!

Réponses

2 nniloc Aug 18 2020 at 07:33

Comme vous le mentionnez, si vous commentez la coord_sfpartie de votre code, la barre d'échelle apparaît. Je suppose qu'il ggsn::scalebardoit obtenir son topleftemplacement à partir de l'ensemble de state_provdonnées entier , et lorsque vous zoomez à coord_sfl' aide de la barre d'échelle, il est rogné.

Edit: méfiez - vous des distorsions extrêmes lorsque vous placez une barre d'échelle sur une carte avec une projection lat / longue à cette échelle:https://stackoverflow.com/a/41373569/12400385

Voici quelques options pour afficher une barre d'échelle.

Option 1

Utiliser ggspatial::annotation_scaleau lieu de ggsnqui semble reconnaître le zoom tel que défini dans coord_sf.

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

Option 2

Utilisez votre code d'origine mais recadrez state_provavant de tracer afin de scalebartrouver le bon 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)