Ajouter une barre d'échelle à une carte ggplot qui a été mise à l'échelle à l'aide de coord_sf?
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
Comme vous le mentionnez, si vous commentez la coord_sf
partie de votre code, la barre d'échelle apparaît. Je suppose qu'il ggsn::scalebar
doit obtenir son topleft
emplacement à partir de l'ensemble de state_prov
données entier , et lorsque vous zoomez à coord_sf
l' 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_scale
au lieu de ggsn
qui 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_prov
avant de tracer afin de scalebar
trouver 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)