2017-05-23 25 views
8

का उपयोग करके एकाधिक उप-विभाजन और छेद के साथ स्पैटलियल पॉलीगॉन ड्रा करें I ggplot2 में छेद के साथ लाइब्रेरी sp से SpatialPolygons आकर्षित करना चाहते हैं। stackoverflow पर दूसरों सवाल के लिए धन्यवाद, मैं जानता हूँ कि इस घड़ी की लिखित बहुभुज साथ काम करते हुए अनुमति दी है कि: के रूप में तैयार हो
http://stackoverflow.com/questions/12047643/geom-polygon-with-multiple-hole/12051278#12051278
वास्तव में, जब एक SpatialPolygons बदलने broom::tidy का उपयोग कर (ggplot2::fortify की जगह), छेद बहुभुज घड़ी की दिशा में सहेजे जाते हैं छेद।
ggplot2 में, जिस तरह से छेद वाले बहुभुज उन्हें fill का उपयोग करके एक बार खींचने के लिए मजबूर कर रहे हैं, और दूसरी बार colour का उपयोग करके, अन्यथा आप बहुभुज को पार करने वाली रेखाएं देख सकते हैं। एकाधिक सबपोलिगन्स से निपटने पर, कुछ छेद के साथ, यह अधिक कठिन है, broom::tidy द्वारा परिभाषित बिंदु सुविधाओं का क्रम बहुभुज भरने की अनुमति नहीं दे सकता है (नीचे छवि देखें)।
क्या आप में से किसी को भी इस समस्या को हल करने के लिए समाधान का समाधान है?ggplot2

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

एक समाधान SpatialPolygons समारोह कॉल में बहुभुज को अलग शामिल होगा। जैसे आईडी = 2 के साथ दो बहुभुज 2 ए और 2 बी बन जाते हैं। क्या यह एक संभावना है या आप xy.sp.l के बाद से समाधान की तलाश में हैं। –

उत्तर

9

एक अच्छा समय sf पैकेज के लिए "पर जाने के" करने के लिए हो सकता है:

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है। sf वस्तु के साथ काम करते हुए, ggplot में बहुत आसान वास्तव में करने के लिए 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

हां वास्तव में। आपका उत्तर यहां एक सरल तरीके से पूछे गए समस्या को हल करता है। मुझे लगता है कि यह लोगों को इस समस्या को एसएफ में माइग्रेट करने के लिए प्रोत्साहित करेगा ... मैं व्यक्तिगत रूप से उस क्षण का इंतजार कर रहा था जब 'एसएफ' पैरामीटर और फ़ंक्शन नामों के साथ पर्याप्त स्थिर था। हालांकि, यह एसएफ सुविधाओं के साथ hatched क्षेत्र बहुभुज आकर्षित करने में सक्षम होने की मेरी दूसरी समस्या उठाता है। एसएफ के साथ इसे अनुमति देने के लिए मुझे एसएफ के साथ अनुमति देने के लिए मेरे फ़ंक्शन को संशोधित करना होगा। लेकिन यह एक और सवाल है, एक और समय के लिए ... धन्यवाद। –

+0

मैं इस जवाब को लोगों को 'एसएफ' में स्थानांतरित करने के लिए स्वीकार करता हूं।लेकिन दूसरा जवाब दिया जाता है क्योंकि यह मेरे प्रश्न का उत्तर है। –

1

लाइनों को जोड़ने समस्या के स्रोत को दर्शाता है। नीला "बहुभुज" खींचा जा रहा है, निचला -> ऊपरी -> छेद।

enter image description here

इस कोड (जो बहुत, सुरुचिपूर्ण खेद नहीं है) पथ वापस पहले टुकड़ा का प्रारंभिक बिंदु करने के लिए 3 के लिए आगे बढ़ने से पहले जाना पड़ता है।

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

आपके उत्तर के लिए धन्यवाद। पहले बहुभुज के एक बिंदु पर वापस जाने से किसी नए उप-बहुभुज या बहुभुज क्रम के लिए समस्या हल हो जाती है। मुझे लगता है कि इस चाल का उपयोग पुस्तकालय 'एसपी' के किसी बहुभुज के लिए 'ggplot2' में प्लॉट किया जा सकता है। –

+0

मेरा मानना ​​है कि यह होगा, क्योंकि यह अतिरिक्त बहुभुज की समस्या से बचाता है (जैसे त्रिकोण ऊपर) बनाया जा रहा है। –

+0

मैं यह उत्तर देता हूं क्योंकि यह सीधे मेरे प्रश्न का उत्तर देता है। हालांकि, लोगों को 'एसएफ' में जाने के लिए प्रोत्साहित करने के लिए, मैं पहला जवाब स्वीकार करता हूं। –

1

इस पोस्ट में एक अच्छा सवाल है और पहले से ही महान उत्तर प्राप्त हुए। मुझे यह भी विश्वास है कि लोगों को sf ऑब्जेक्ट्स के साथ काम करना सीखना चाहिए क्योंकि यह आर में स्थानिक डेटा प्रकार की अगली पीढ़ी है। लेकिन मैं इस मामले में geom_spatialggspatial पैकेज से स्पेटियल पॉलीगॉन प्लॉट करने का विकल्प हो सकता हूं।

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