2015-10-21 6 views
9

के लिए स्थान मजबूर करना मैं बहु-स्तर वाले समूह वाले बॉक्सप्लॉट्स के लिए "रिक्त स्थान" रखने की कोशिश कर रहा हूं।ggplot2: खाली दूसरी-स्तरीय श्रेणी

set.seed(42) 
n <- 100 
dat <- data.frame(x=runif(n), 
        cat1=sample(letters[1:4], size=n, replace=TRUE), 
        cat2=sample(LETTERS[1:3], size=n, replace=TRUE)) 
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2)) 

enter image description here

मैं मजबूर हैं समूहों में से एक रिक्त:

dat <- subset(dat, ! (cat1 == 'b' & cat2 == 'B')) 
table(dat$cat1, dat$cat2) 
##  
##  A B C 
## a 9 9 7 
## b 8 0 5 
## c 13 11 6 
## d 11 10 5 
ggplot(dat, aes(cat1, x)) + geom_boxplot(aes(fill=cat2)) 

enter image description here

दूसरे समूह, "बी", अब जगह को भरने के लिए विस्तार किया गया है । क्या मैं चाहता है:

enter image description here

SO 9818835 (प्रकट करने के लिए एक खाली स्तर के लिए मजबूर) शीर्ष स्तर पर ठीक काम करता है, लेकिन मैं समझ नहीं कैसे इसके बारे में एक दूसरे स्तर के लिए काम करने के लिए प्राप्त करने के लिए श्रेणियाँ। scale_x_discrete(...) में, मैं सेटिंग की कोशिश की:

  • breaks=letters[1:4]
  • breaks=LETTERS[1:3]
  • breaks=list(letters[1:4], LETTERS[1:3]) (वार)
  • breaks=NULL
  • breaks=func जहां func <- function(x, ...) { browser(); 1; } आदेश का निवारण करने के लिए; यह केवल letters[1:4] की पेशकश की और कभी भी दूसरे स्तर

interactions(letters[1:4], LETTERS[1:3]) का उपयोग करने से कभी भी खाली स्थान नहीं छोड़ा गया। मैंने x मूल्य से बाहर की सीमा को इंजेक्शन करके scale_y_continuous(limits) के साथ स्क्रीन को मजबूर कर एक कामकाज की कोशिश की, लेकिन ggplot2 मेरे लिए बहुत स्मार्ट है और फिर अंतर को बंद कर देता है।

क्या सुरुचिपूर्ण हैं (यानी, ggplot2 तंत्र में "सही") समाधान?

+0

डेटा कैसे सुंदर यह होने की जरूरत है की कोशिश नहीं होगा? ऐसा लगता है कि इन रिकॉर्ड्स के लिए 'x' शून्य पर सेट करना कुछ ऐसा लगता है जो काफी उचित दिखता है। '<- dat %>% उत्परिवर्तन (x = ifelse (cat1 == 'b' और cat2 == 'बी', 0, x))' – akhmed

+1

यह शानदार प्रोग्रामेटिक रूप से है (और मैंने पहले से ही यह कोशिश की थी, 'scale_y_continuous (सीमाएं) ' कदम), लेकिन जब मैं अपने दृश्यों की बात करता हूं तो मैं थोड़ा ओसीडी हूं: मैं हमेशा साजिश के नीचे विचलित रेखा पर नजर रखूंगा। – r2evans

+0

प्लस "एक लाइन का मतलब डेटा नहीं है" और "एक पंक्ति मान 0 के एक डेटा बिंदु इंगित करता है" के बीच सांख्यिकीय अंतर है। – r2evans

उत्तर

7

coord_cartesian एक समाधान है जिसे आप ढूंढ रहे हैं?

यह ज़ूम इन करेगा और "outsmart" की तरह scale_y_continuous

library(dplyr) 
library(ggplot2) 

set.seed(42) 
n <- 100 
dat <- data.frame(x=runif(n), 
        cat1=sample(letters[1:4], size=n, replace=TRUE), 
        cat2=sample(LETTERS[1:3], size=n, replace=TRUE)) 

LARGE_VALUE <- 2 

dat <- dat %>% 
    mutate(x = ifelse(cat1 == 'b' & cat2 == 'B', 
        LARGE_VALUE, 
        x)) 

ggplot(dat, aes(cat1, x)) + 
    geom_boxplot(aes(fill=cat2)) + 
    coord_cartesian(ylim = c(0,1)) 

enter image description here

+0

यूप, जो मुझे चाहिए वह करता है। मैं थोड़ा आश्चर्यचकित हूं कि 'ड्रॉप = गलत' ऐसा नहीं करता जो मुझे लगता है कि यह करेगा, लेकिन फिर मुझे पूरी तरह से 'ggplot2' grok करने के लिए और अधिक काम करने की आवश्यकता है। धन्यवाद। – r2evans