2015-11-29 10 views
5

में एकाधिक ज्यामिति वाले विज़ुअल ऑब्जेक्ट्स के लिए प्लॉट ऑर्डर को नियंत्रित करना मैं ऑब्जेक्ट ओवरलैप करते समय दिखाई देने वाले नियंत्रण को नियंत्रित करने के लिए एक विशिष्ट क्रम में प्लॉट करना चाहता हूं। प्रत्येक डेटा पंक्ति 2 ज्यामिति परतों के संयुक्त रूप से मानचित्र करती है - साजिश के विवरणों की आवश्यकता होती है। मैं ऐसा करने के लिए एक लूप का उपयोग कर रहा हूं, लेकिन यह बहुत धीमा है। मुझे आश्चर्य है कि क्या कोई बेहतर तरीका है? जैसेggplot2

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2)) 

ggplot(d, aes(x, y, group=grp)) + 
    geom_polygon(aes(fill = factor(grp))) + 
    geom_line(size=1) 

enter image description here

प्रत्येक बहुभुज लाइन अपने बहुभुज के साथ साजिश चाहिए - तो जैसे लाल बहुभुज की रेखा नीली बहुभुज द्वारा अस्पष्ट होनी चाहिए। क्या geom_polygon और geom_line दोनों एक ही डेटासेट का उपयोग करते समय इसे लूपिंग के बिना प्राप्त करने का कोई तरीका है?


संपादित करें: पाशन तरीकों ..

यहाँ पाश तरीकों मैं का उपयोग किया है रहे हैं। प्रदर्शन की तुलना करने के लिए एक बेहतर डेटासेट जोड़ा गया। मेरी मशीन पर चलाने के लिए दोनों 5.6 डिग्री लेते हैं। तुलनात्मक रूप से सामान्य दृष्टिकोण (ggplot(d, aes(x, y, fill=factor(grp))) + geom_polygon() + geom_line(size=1)) 0.45 लेता है।

d = data.frame(x = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3), 
       y = sample(-30:30,99,rep=T) + rep(sample(1:100,33),each=3), 
       grp = rep(1:33,each=3)) 

# Method 1 - for loop 
p = ggplot() 
for(g in unique(d$grp)){ 
    dat = subset(d, grp == g) 
    p = p + geom_polygon(data=dat, aes(x, y, fill = factor(grp))) + 
    geom_line(data=dat, aes(x, y), size=1) 
} 
print(p) 

# Method 2 - apply 
ggplot() + lapply(unique(d$grp), FUN=function(g){ 
    dat = subset(d, grp == g) 
    list(geom_polygon(data=dat, aes(x, y, fill = factor(grp))), 
     geom_line(data=dat, aes(x, y), size=1)) 
}) 

enter image description here

+0

मेरा मानना ​​है कि आपको जिस समस्या का सामना करना पड़ रहा है उसे लाइन के साथ करना है। यदि आप geom_line() को हटाते हैं तो आपको वांछित परिणाम मिलते हैं। साथ ही, यदि आप geom_polygon() से पहले geom_line डालते हैं तो आपको लगता है कि आपका वांछित आउटपुट –

+1

क्या आप उस लूप को दिखा सकते हैं जिसका आप उपयोग कर रहे हैं? – Heroka

+0

@ गोथोरी मुझे खेद है, मेरे पास कोई समाधान नहीं है। मेरे पास एकमात्र विचार है कि प्रत्येक समूह के लिए एक अतिरिक्त बहुभुज बनाना है जो कि किनारों पर थोड़ा बड़ा है, आपको लाइन की आवश्यकता है, और उनको पहले काले रंग में प्लॉट करें और फिर रंग में ओवरप्लॉट करें। हालांकि, मुझे लगता है कि यह आपकी छवि उत्पन्न करने के लिए लूप चलाने के लिए प्रोग्राम/परीक्षण के लिए और अधिक समय लेगा। – Heroka

उत्तर

1

मैं सिर्फ अपने कोड का इस्तेमाल किया और ggplot2 यह इस

d = data.frame(x=c(1,5,2,2,4,2), y=c(1,1,4,3,3,5), grp=c(1,1,1,2,2,2)) 

ggplot(d, aes(x, y, group=grp)) + 
    geom_line(size=1)+ 
    geom_polygon(aes(fill = factor(grp))) 

तरह लग रहा है में परतों का क्रम बदल और परिणाम यह एक

enter image description here

है

यह भी ध्यान दें कि यदि आप geom_line कॉल को हटाते हैं तो आप एक ही परिणाम उत्पन्न करते हैं लेकिन सीमा के बिना।

+0

क्षमा करें Matian जो वास्तव में मदद नहीं करता है। आप बस सभी बहुभुजों (नीचे नीचे) सभी लाइनों की साजिश कर रहे हैं। देखें कि नीले-हरे रंग के बहुभुज ने रेखा का हिस्सा कैसे खो दिया है .. – geotheory

+0

मैं समझता हूं। जहां तक ​​मैं अभी सोच सकता हूं, मैं लाइन को छोड़ने का सुझाव दूंगा (यह मूल उदाहरण में त्रिकोणों को सीमाबद्ध नहीं करता है)। मैं इसे बाद में एक दूसरा विचार दूंगा। मैं सोच रहा हूं कि geom_line ऐसा करने का सबसे अच्छा तरीका नहीं हो सकता है ... शायद geom_segment –

+0

हाँ लाइन सिर्फ एक डेमो उदाहरण है। मेरे विज़ुअलाइज़ेशन के लिए 2 अलग ज्यामिति की आवश्यकता होती है। – geotheory