sf ไปยัง data.frame: ทำไมต้อง as_Spatial ก่อน as.data.frame
สมมติว่าฉันต้องการเพิ่มป้ายกำกับให้กับโครงร่าง 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 ())ผิด
คำตอบ
คุณสามารถใช้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")