Aggiungere una barra di scala a una mappa ggplot che è stata scalata utilizzando coord_sf?
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
Come hai detto, se commenti la coord_sf
parte del codice, viene visualizzata la barra della scala. La mia ipotesi è che ggsn::scalebar
debba ottenere la sua topleft
posizione dall'intero state_prov
set di dati e quando si ingrandisce utilizzando coord_sf
la 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_scale
posto del ggsn
quale 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_prov
prima di stampare in modo da scalebar
poter 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)
