Tambahkan bilah skala ke peta ggplot yang telah diskalakan menggunakan coord_sf?

Aug 18 2020

Saya telah membuat peta menggunakan paket sf dan 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)

yang menghasilkan peta berikut di Rstudio:

Itu bagus, tapi saya perlu menambahkan bar skala padanya. Ketika saya mencoba mengubah kode menggunakan ggsn, saya tidak melihat bilah skala sama sekali.

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) 

Saya sudah mencoba mengubah ketinggian, st.dist, dan lokasi tetapi tidak berhasil. Saya dapat melihat skalebar dengan skala yang buruk ketika saya menghapus panggilan ke coord_sf (), membuat saya percaya bahwa ggsn tidak mengenali bahwa peta sedang diperbesar oleh coord_sf ().

Bagaimana cara mengatasinya? ggsn tampaknya tidak mudah dimodifikasi. Saya terbuka untuk menggunakan paket atau metode lain, tetapi saya perlu terus memanggil ggplot dengan cara yang sama karena saya memiliki peta yang jauh lebih rumit berdasarkan struktur yang sama.

Terima kasih!

Jawaban

2 nniloc Aug 18 2020 at 07:33

Seperti yang Anda sebutkan, jika Anda mengomentari coord_sfbagian dari kode Anda, bilah skala akan muncul. Dugaan saya ggsn::scalebarharus mendapatkan lokasinya topleftdari seluruh state_provdataset, dan ketika Anda memperbesar menggunakan coord_sfskalebar akan terpotong.

Sunting: waspadalah terhadap distorsi ekstrim saat meletakkan bilah skala pada peta dengan proyeksi lintang / bujur pada skala ini:https://stackoverflow.com/a/41373569/12400385

Berikut adalah beberapa opsi untuk menampilkan bilah skala.

Pilihan 1

Gunakan ggspatial::annotation_scalealih-alih ggsnyang tampaknya mengenali zoom seperti yang didefinisikan dalam coord_sf.

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

pilihan 2

Gunakan kode asli Anda tetapi potong state_provsebelum membuat plot sehingga scalebardapat menemukan yang benar 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)