2017-05-23 23 views
8

Tôi muốn vẽ SpatialPolygons từ thư viện sp có lỗ hổng trong ggplot2. Nhờ người khác hỏi về stackoverflow, tôi biết rằng điều này được phép khi giao dịch với chiều kim đồng hồ bằng văn bản đa giác:
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
Thật vậy, khi chuyển một SpatialPolygons sử dụng broom::tidy (thay thế ggplot2::fortify), lỗ đa giác được lưu trong chiều kim đồng hồ để được vẽ như lỗ.
Trong ggplot2, cách các đa giác có lỗ được rút ra lực để vẽ chúng khi sử dụng fill và một lần khác bằng cách sử dụng colour, nếu không bạn có thể thấy các đường chéo đa giác. Khi giao dịch với nhiều subpolygons, một số có lỗ, điều này phức tạp hơn, thứ tự các tính năng điểm như được xác định bởi broom::tidy có thể không cho phép điền các đa giác (xem hình bên dưới).
Có ai trong số các bạn có một giải pháp để loại bỏ hành vi này?Vẽ SpatialPolygons với nhiều subpolygons và lỗ bằng cách sử dụng ggplot2

Dưới đây là một ví dụ tái sản xuất:

library(sp) 
library(ggplot2) 

# Create two polygons: second would be a hole inside the first 
xy = cbind(
    x = c(13.4, 13.4, 13.6, 13.6, 13.4), 
    y = c(48.9, 49, 49, 48.9, 48.9) 
    ) 
hole.xy <- cbind(
    x = c(13.5, 13.5, 13.45, 13.45, 13.5), 
    y = c(48.98, 48.92, 48.92, 48.98, 48.98) 
) 

# Transform as SpatialPolygons with holes 
xy.sp <- SpatialPolygons(list(
    Polygons(list(Polygon(xy), 
       Polygon(hole.xy, hole = TRUE)), "1"), 
    Polygons(list(Polygon(xy + 0.2), 
       Polygon(xy + 0.35), 
       Polygon(hole.xy + 0.2, hole = TRUE)), "2") 
)) 

# Transform SpatialObject to be used by ggplot2 
xy.sp.l <- broom::tidy(xy.sp) 

ggplot(xy.sp.l) + 
    geom_polygon(aes(x = long, y = lat, group = id, fill = id)) 

ggplot fill problem with SpatialPolygons with holes

+0

Một giải pháp sẽ bao gồm tách các đa giác trong cuộc gọi SpatialPolygons chức năng. ví dụ. Hai đa giác với id = 2 trở thành 2a & 2b. Đây có phải là một khả năng hoặc bạn đang tìm kiếm một giải pháp từ xy.sp.l trở đi. –

Trả lời

9

Có thể là một thời điểm tốt để "đi qua" để gói sf. Làm việc với các đối tượng sf là trong thực tế dễ dàng hơn nhiều trong ggplot, nhờ vào hình học geom_sf:

library("sf") 
library("rgeos") 
sf_poly <- as(xy.sp, "sf") 
sf::st_crs(sf_poly) <- 4326 
sf_poly$id <- c(1,2) 
ggplot(sf_poly) + 
    geom_sf(aes(fill = as.factor(id))) 

enter image description here

+0

Có thực sự. Câu trả lời của bạn giải quyết vấn đề được hỏi ở đây một cách đơn giản. Tôi đoán điều này sẽ khuyến khích những người có vấn đề này di chuyển sang sf ... Tôi đã đích thân chờ đợi thời điểm khi 'sf' đủ ổn định với các tham số và tên hàm. Tuy nhiên, điều này làm tăng vấn đề khác của tôi về việc có thể vẽ các đa giác vùng nở với các tính năng sf. Tôi sẽ phải sửa đổi chức năng của tôi để cho phép điều này với sf và sau đó tờ rơi với sf. Nhưng đây là một câu hỏi khác, một lần khác ... Cảm ơn. –

+0

Tôi chấp nhận câu trả lời này để khiến mọi người chuyển sang 'sf'.Nhưng câu trả lời thứ hai được trao vì đây là câu trả lời cho câu hỏi của tôi. –

1

Thêm dòng cho thấy nguồn gốc của vấn đề. Màu xanh "đa giác" đang được vẽ, thấp hơn -> trên -> lỗ.

enter image description here

Mã này (mà không phải là rất thanh lịch, xin lỗi) làm cho con đường quay trở lại điểm khởi đầu của phần đầu tiên trước khi tiến hành 3rd.

library(dplyr) 
    extra <- xy.sp.l %>% 
     filter(piece != 1) %>% 
     group_by(id, group) %>% 
     summarise(last_pt = max(order)) 


for (n in 1:nrow(extra)) { 
    id_ex <- as.character(extra[n,"id"]) 
    x <- subset(xy.sp.l, id == id_ex & piece == 1 & order == 1) 
    x$order <- as.numeric(extra[n,"last_pt"]) + 0.5 
    xy.sp.l <- rbind(xy.sp.l,x) 
} 

xy.sp.l <- xy.sp.l[order(xy.sp.l$id, xy.sp.l$order),] 

enter image description here

+0

Cảm ơn câu trả lời của bạn. Quay trở lại một điểm của đa giác đầu tiên dường như giải quyết vấn đề cho bất kỳ thứ tự đa giác hoặc đa giác mới nào. Tôi đoán mẹo này có thể được sử dụng cho bất kỳ đa giác nào của thư viện 'sp' được vẽ trong' ggplot2'. –

+0

Tôi tin rằng nó sẽ, vì nó tránh được vấn đề của các đa giác phụ (như hình tam giác ở trên) được tạo ra. –

+0

Tôi nhận được câu trả lời này bởi vì nó trả lời trực tiếp câu hỏi của tôi. Tuy nhiên, để khuyến khích mọi người chuyển sang 'sf', tôi chấp nhận câu trả lời đầu tiên. –

1

bài Đây là một câu hỏi hay và đã nhận được câu trả lời tuyệt vời. Tôi cũng tin rằng mọi người nên học cách làm việc với các đối tượng sf vì nó là thế hệ tiếp theo của kiểu dữ liệu không gian trong R. Nhưng tôi muốn chia sẻ rằng trong trường hợp này geom_spatial từ gói ggspatial có thể là một tùy chọn để vẽ SpatialPolygons.

library(sp) 
library(ggplot2) 
library(ggspatial) 

ggplot() + 
    geom_spatial(xy.sp, aes(fill = id)) 
# Ignoring argument 'mapping' in geom_spatial.SpatialPolygons 
# Autodetect projection: assuming lat/lon (epsg 4326) 

enter image description here

Các vấn đề liên quan