2014-06-09 5 views
11

मुझे वास्तव में वायलिन भूखंडों की तरह शुरू करना शुरू हुआ, क्योंकि जब वे मजाकिया वितरण करते हैं तो मुझे बॉक्स प्लॉट्स का बेहतर अनुभव मिलता है। मुझे बहुत सी चीजों को स्वचालित करना पसंद है, और इस प्रकार एक समस्या में भाग गया: जब एक चर के पास 0 भिन्नता होती है, तो बॉक्सप्लॉट आपको उस बिंदु पर बस एक रेखा देता है। हालांकि Geom_violin, एक त्रुटि के साथ समाप्त होता है। मुझे क्या व्यवहार पसंद आएगा? खैर, या तो एक रेखा या कुछ भी नहीं डालें, लेकिन कृपया मुझे अन्य चर के लिए वितरण दें।ggplot2 geom_violin 0 भिन्नता

ठीक है, त्वरित उदाहरण:

dff=data.frame(x=factor(rep(1:2,each=100)),y=c(rnorm(100),rep(0,100))) 
ggplot(dff,aes(x=x,y=y)) + geom_violin() 

Error in `$<-.data.frame`(`*tmp*`, "n", value = 100L) : 
    replacement has 1 row, data has 0 

हालांकि पैदावार, क्या काम करता है:

ggplot(dff,aes(x=x,y=y)) + geom_boxplot() 

अद्यतन:

मुद्दा कल के रूप में हल हो गई है: https://github.com/hadley/ggplot2/issues/972

अद्यतन 2: (प्रश्न लेखक की ओर से) वाह, हैडली खुद जवाब दिया! geom_violin अब geom_density और आधार R density के साथ लगातार व्यवहार करता है।

हालांकि, मुझे नहीं लगता कि व्यवहार अभी तक इष्टतम है।

(1) 'शून्य' समस्या

बस मेरे मूल उदाहरण के साथ इसे चलाने:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rnorm(100), rep(0,100))) 
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE) 

इस पैदावार: enter image description here

सही एक उपयुक्त पर साजिश है 'सभी शून्य' का प्रतिनिधित्व? मुझे ऐसा नहीं लगता। यह ट्रिम करना बेहतर है जो एक पंक्ति को उत्पन्न करता है यह दिखाने के लिए कि डेटा में कोई बदलाव नहीं है। वर्कअराउंड समाधान: जोड़ें + geom_boxplot()

(2) मैं वास्तव में TRIM=TRUE कर सकते हैं।

उदाहरण:

dff=data.frame(x=factor(rep(1:2, each=100)), y=c(rgamma(100,1,1), rep(0,100) )) 
ggplot(dff,aes(x=x,y=y)) + geom_violin(trim=FALSE) 

अब मैं गैर शून्य डेटा, और मानक कर्नेल घनत्व अनुमान इस सही ढंग से संभाल नहीं है। trim=T के साथ मैं जल्दी से देख सकता हूं कि डेटा कड़ाई से सकारात्मक है।

मैं बहस नहीं कर रहा हूं कि वर्तमान व्यवहार 'गलत' है, क्योंकि यह अन्य कार्यों के अनुरूप है। हालांकि, geom_violin विभिन्न संदर्भों में अलग-अलग डेटा की खोज के लिए विभिन्न संदर्भों में उपयोग किया जा सकता है। उदाहरण के लिए विषम डेटा प्रकारों (सकारात्मक + skewed या नहीं) के साथ फ्रेम।

ggplot2 मुद्दा जब तक इस से निपटने के लिए
+0

गीथब पर किसी मुद्दे के रूप में सबमिट करने के लिए उचित चीज़ की तरह लगता है, विशेष रूप से इस मामले को संभालने के बाद शायद यह बहुत आसान है (हालांकि प्रदर्शित करने के बारे में मजबूत भावनाएं हो सकती हैं)। – joran

+1

एक त्वरित हैक के रूप में, आप वाई-मानों में से एक को 0.0001 (शून्य के बजाय) पर सेट कर सकते हैं और 'geom_violin' काम करेगा। यदि आप 'ggplot2' का उपयोग करने पर सेट नहीं हैं तो आप 'vioplot' पैकेज भी देख सकते हैं। जब आप इसे समान मानों का गुच्छा खिलाते हैं तो 'vioplot' त्रुटि नहीं फेंकता है। – eipi10

+0

बस एक और संभावित विकल्प के रूप में, 'Hmisc' पैकेज में' panel.bbplot' (बॉक्स-प्रतिशत प्लॉट) फ़ंक्शन शामिल है जो 'जाली' से 'bwplot' फ़ंक्शन के साथ वायलिन प्लॉट बना सकता है। '? Panel.bpplot' के उदाहरण अनुभाग देखें। यह एक एकल रेखा उत्पन्न करता है जब आप इसे समान मूल्यों का वेक्टर खिलाते हैं। – eipi10

उत्तर

3

तीन विकल्प हल हो गई है:

  1. एक त्वरित हैक रूप में, आप 0 करने के लिए y- मानों में से एक सेट कर सकते हैं।0001 (शून्य के बजाय) और geom_violin काम करेगा।
  2. vioplot पैकेज देखें यदि आप ggplot2 का उपयोग करने पर सेट नहीं हैं। vioplot कोई त्रुटि नहीं फेंकता है जब आप इसे समान मानों का समूह बनाते हैं।
  3. Hmisc पैकेज में panel.bpplot (बॉक्स-प्रतिशत प्लॉट) फ़ंक्शन शामिल है जोपैकेज से bwplot फ़ंक्शन के साथ वायलिन प्लॉट बना सकता है। ?panel.bpplot के उदाहरण खंड देखें। यह एक एकल रेखा उत्पन्न करता है जब आप इसे समान मूल्यों का वेक्टर खिलाते हैं।
+1

देखें जब आप विकल्प 1 का उपयोग करते हैं, तो अन्य सभी वायलिनप्लॉट्स (भिन्नता> 0 के साथ) विकृत हो जाते हैं - एक सबसेटिंग दृष्टिकोण के साथ एक वर्कअराउंड संभव है: http://stackoverflow.com/a/25083853/1498405 – hardmooth