Aggiungere una barra di scala a una mappa ggplot che è stata scalata utilizzando coord_sf?

Aug 18 2020

Ho prodotto una mappa usando il pacchetto sf e 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)

che produce la seguente mappa in Rstudio:

È fantastico, ma devo aggiungere una barra di scala. Quando provo a modificare il codice usando ggsn, non vedo affatto la barra della scala.

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) 

Ho provato a modificare l'altezza, la st.dist e la posizione senza successo. Riesco a vedere una barra di scala mal ridimensionata quando rimuovo la chiamata a coord_sf (), facendomi credere che ggsn non riconosce che la mappa viene ingrandita da coord_sf ().

Come lo risolvo? ggsn non sembra essere facilmente modificabile. Sono aperto a utilizzare un altro pacchetto o metodo, ma devo continuare a chiamare ggplot in modo simile poiché ho una mappa molto più complicata basata sulla stessa struttura.

Grazie!

Risposte

2 nniloc Aug 18 2020 at 07:33

Come hai detto, se commenti la coord_sfparte del codice, viene visualizzata la barra della scala. La mia ipotesi è che ggsn::scalebardebba ottenere la sua topleftposizione dall'intero state_provset di dati e quando si ingrandisce utilizzando coord_sfla barra di scala viene ritagliata.

Modifica: fai attenzione alla distorsione estrema quando metti una barra della scala su una mappa con proiezione lat / long a questa scala:https://stackoverflow.com/a/41373569/12400385

Ecco un paio di opzioni per visualizzare una barra della scala.

opzione 1

Usa al ggspatial::annotation_scaleposto del ggsnquale sembra riconoscere lo zoom come definito in coord_sf.

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

opzione 2

Usa il tuo codice originale ma ritaglia state_provprima di stampare in modo da scalebarpoter trovare il file corretto 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)