เพิ่มแถบมาตราส่วนลงในแผนที่ ggplot ที่ปรับขนาดโดยใช้ Coord_sf?

Aug 18 2020

ฉันได้สร้างแผนที่โดยใช้แพ็คเกจ sf และ 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)

ซึ่งสร้างแผนที่ต่อไปนี้ใน Rstudio:

เยี่ยมมาก แต่ต้องเพิ่มสเกลบาร์ด้วย เมื่อฉันพยายามแก้ไขโค้ดโดยใช้ ggsn ฉันไม่เห็นแถบมาตราส่วนเลย

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) 

ฉันพยายามเปลี่ยนความสูง st.dist และตำแหน่งแล้ว แต่ไม่สำเร็จ ฉันสามารถเห็นแถบมาตราส่วนที่ปรับขนาดได้ไม่ดีเมื่อฉันลบการเรียกไปที่ Coord_sf () ทำให้ฉันเชื่อว่า ggsn ไม่ทราบว่าแผนที่กำลังซูมเข้าโดย Coord_sf ()

ฉันจะแก้ไขปัญหานี้ได้อย่างไร ggsn ดูเหมือนจะไม่สามารถแก้ไขได้ง่ายๆ ฉันเปิดให้ใช้แพ็คเกจหรือวิธีการอื่น แต่ฉันจำเป็นต้องเรียกใช้ ggplot ต่อไปในลักษณะที่คล้ายกันเนื่องจากฉันมีแผนที่ที่ซับซ้อนกว่ามากโดยใช้โครงสร้างเดียวกัน

ขอบคุณ!

คำตอบ

2 nniloc Aug 18 2020 at 07:33

ดังที่คุณกล่าวถึงหากคุณแสดงความคิดเห็นในcoord_sfส่วนของรหัสแถบมาตราส่วนจะปรากฏขึ้น ฉันเดาว่าggsn::scalebarต้องได้รับtopleftตำแหน่งจากstate_provชุดข้อมูลทั้งหมดและเมื่อคุณซูมโดยใช้coord_sfแถบมาตราส่วนจะถูกครอบตัดออก

แก้ไข:ระวังความผิดเพี้ยนอย่างมากเมื่อวางแถบมาตราส่วนบนแผนที่ที่มีการฉายแบบ lat / long ในระดับนี้:https://stackoverflow.com/a/41373569/12400385

นี่คือสองตัวเลือกในการรับแถบมาตราส่วนเพื่อแสดง

ตัวเลือกที่ 1

ใช้ggspatial::annotation_scaleแทนซึ่งดูเหมือนว่าจะรับรู้การซูมที่กำหนดไว้ในggsncoord_sf

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

ทางเลือกที่ 2

ใช้รหัสเดิมของคุณ แต่การเพาะปลูกstate_provก่อนที่จะวางแผนเพื่อให้สามารถค้นหาที่ถูกต้องscalebartopleft

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)