sf ไปยัง data.frame: ทำไมต้อง as_Spatial ก่อน as.data.frame

Nov 05 2020

สมมติว่าฉันต้องการเพิ่มป้ายกำกับให้กับโครงร่าง geom_sf () เพื่อรับสิ่งต่อไปนี้:

ณ เดือนพฤศจิกายน / 2020 วิธีนี้ไม่มีอยู่ดังนั้นฉันจึงได้รับคำเตือนและไม่มีอะไรถูกพล็อตเมื่อฉันลอง:

library(sf)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
ggplot() +
  geom_sf(data = nc, aes(label = CNTY_ID))

 Warning message:
 Ignoring unknown aesthetics: label

เมื่อพยายามเพิ่มป้ายกำกับด้วยตนเองผ่านgeom_text ()ฉันไม่สามารถหาวิธีเปลี่ยนจากncเป็น "nc2" ซึ่งฉันสามารถใช้ใน ggplot:

หากฉันลองทำสิ่งต่อไปนี้ผลลัพธ์ไม่เป็นไปตามที่คาดไว้:

nc2 <- nc %>% st_centroid() %>%        # ok, transform multypoligon to centroid
  as.data.frame()                      # does not return something useful, WHY ?

แต่ถ้าฉันทำ:

nc2 <- nc %>% st_centroid() %>%  
  as_Spatial() %>%                     # this is nonsense, why ?
  as.data.frame()

ตอนนี้ใช้สิ่งต่อไปนี้ฉันจะได้พล็อตที่ต้องการในตอนแรกพร้อมป้ายกำกับที่เหมาะสม

ggplot() +
  geom_sf(data = nc) +
  geom_text(data=nc2, aes(coords.x1, coords.x2, label=CNTY_ID))

วิธีที่แนะนำในการเปลี่ยนจาก sf ไป tibble / data.frame เป็น ggplot คืออะไร สำหรับฉันแล้วนี่เป็นงานธรรมดาและต้องทำสองขั้นตอน(as_Spatial () + as.data.frame ())ผิด

คำตอบ

3 AllanCameron Nov 05 2020 at 06:45

คุณสามารถใช้stat_sf_coordinatesกับgeom = "text"ใน ggplot คุณไม่จำเป็นต้องสร้าง data frame ที่สองด้วยซ้ำ คุณสามารถส่งผ่านst_centroidเป็นพารามิเตอร์

ต่อไปนี้เป็น reprex เต็มรูปแบบที่ควรใช้กับทุกคนที่ติดตั้ง ggplot2 และ sf เวอร์ชันล่าสุด:

ggplot2::ggplot(sf::st_read(system.file("shape/nc.shp", package = "sf"))) +
  ggplot2::geom_sf() +
  ggplot2::stat_sf_coordinates(fun.geometry = sf::st_centroid,
                               ggplot2::aes(label = CNTY_ID), geom = "text")