Ggplot2 बॉक्सप्लॉट में आउटलेयर की उपेक्षा करें


132

मैं ggplot2 बॉक्सप्लॉट में आउटलेर को कैसे अनदेखा करूंगा? मैं बस उन्हें गायब नहीं करना चाहता (यानी outlier.size = 0), लेकिन मैं उन्हें इस तरह से नजरअंदाज करना चाहता हूं कि y अक्ष 1 / 3rd प्रतिशतक दिखाने के लिए। मेरे आउटलायर्स "बॉक्स" को इसके छोटे से व्यावहारिक रूप से एक लाइन को छोटा करने का कारण बन रहे हैं। क्या इससे निपटने के लिए कुछ तकनीकें हैं?

यहाँ एक उदाहरण संपादित करें :

y = c(.01, .02, .03, .04, .05, .06, .07, .08, .09, .5, -.6)
qplot(1, y, geom="boxplot")

यहाँ छवि विवरण दर्ज करें


कुछ नमूना डेटा और एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण से आपकी सहायता करना आसान हो जाएगा।
एंड्री

3
मेरी फ़ाइल 200 मेग है! बस कोई भी डेटासेट लें जहां पहली और तीसरी मात्रा के बीच बहुत सारे डेटापॉइंट हों और कुछ आउटलेयर हों (आपको केवल 1 की जरूरत है)। यदि बाहरी 1 / 3rd से बहुत दूर है तो आवश्यक रूप से बक्से बाहर की ओर
निकलने के

हां, यही मेरे मन में था। इस तरह के डेटासेट बनाएं और इसे ggplot () स्टेटमेंट के साथ एक साथ पोस्ट करने के लिए dput () का उपयोग करें। आपकी सहायता में हमारी मदद करें।
एंड्री

क्या आप उस y- अक्ष की सीमा को नहीं बदल सकते हैं जिसमें आप जिस y- अक्ष में रुचि रखते हैं, उसके हिस्से को "ज़ूम" करने के लिए करते हैं?
गैविन सिम्पसन

2
मुझे देखने दो .... ओह हाँ, क्षमा करें। सिर्फ fivenum()IIRC को निकालने के लिए डेटा पर करते हैं, बॉक्सप्लेट पर ऊपरी और निचले टिका के लिए उपयोग किया जाता है और उस आउटपुट का उपयोग उस scale_y_continuous()कॉल में किया जाता है जो @Ritchie ने दिखाया था। R और ggplot प्रदान करने वाले टूल का उपयोग करके इसे बहुत आसानी से स्वचालित किया जा सकता है। यदि आपको व्हिस्की को भी शामिल करने की आवश्यकता है, तो व्हिस्कर्स के boxplot.stats()लिए ऊपरी और निचली सीमा प्राप्त करने के लिए उपयोग करने पर विचार करें और फिर उपयोग करें scale_y_continuous()
गैविन सिम्पसन

जवाबों:


141

यहां बॉक्सप्लॉट.स्टेट्स का उपयोग करके एक समाधान है

# create a dummy data frame with outliers
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))


# compute lower and upper whiskers
ylim1 = boxplot.stats(df$y)$stats[c(1, 5)]

# scale y limits based on ylim1
p1 = p0 + coord_cartesian(ylim = ylim1*1.05)

15
स्वचालित संगणना के लिए +1, डेटा को छोड़कर ज़ूम करने के लिए ord_cartesian का उपयोग करने के लिए +1
बेन बोल्कर

2
@ - आपके पास दो खाते हैं? =) @ रामनाथ - यह एक बहुत ही सुंदर समाधान है
SFun28

7
उपरोक्त विधि का उपयोग करना, सीमा दूसरे पर एक तरफ और और बड़े चरम पर एक छोटे से चरम द्वारा झुका हुआ हो सकता है, उदाहरण के लिए ylim <- c(-0.1, 1000) * 1.05देता है [1] 0.105 1050। आप उपयोग कर सकते हैं मतलब के आसपास समान सीमा पाने के लिए ylim + c(-0.05, 0.05) * diff(ylim) / 2। मेरी राय में Prettier।
ब्रैम विस्सर

2
@ रामनाथ $ आंकड़े [c (1,5)] क्या करते हैं?
ल्यूकज

3
यदि आप उपयोग करते हैं तो यह काम नहीं कर रहा है facet_grid()। तब आपके पास एक के बजाय बहु-बॉक्स बॉक्स हैं। इस प्रकार आपको सही सीमा नहीं मिलती है।
विथशेडोवो

204

geom_boxplot(outlier.shape = NA)आउटलेर प्रदर्शित नहीं करने और scale_y_continuous(limits = c(lower, upper))अक्ष सीमा बदलने के लिए उपयोग करें ।

एक उदाहरण।

n <- 1e4L
dfr <- data.frame(
  y = exp(rlnorm(n)),  #really right-skewed variable
  f = gl(2, n / 2)
)

p <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot()
p   # big outlier causes quartiles to look too slim

p2 <- ggplot(dfr, aes(f, y)) + 
  geom_boxplot(outlier.shape = NA) +
  scale_y_continuous(limits = quantile(dfr$y, c(0.1, 0.9)))
p2  # no outliers plotted, range shifted

वास्तव में, जैसा कि रामनाथ ने अपने उत्तर में दिखाया (और टिप्पणियों में भी एंड्री), यह आपके द्वारा सांख्यिकी की गणना करने के बाद तराजू को काटने के लिए अधिक समझ में आता है coord_cartesian

coord_cartesian(ylim = quantile(dfr$y, c(0.1, 0.9)))

(आपको scale_y_continuousअक्ष के टूटने को ठीक करने के लिए शायद अभी भी उपयोग करना होगा।)


1
तो मुझे निम्न / ऊपरी की गणना करनी होगी - शायद 1/3 प्रतिशत की गणना करके? मतलब कोई ऑटो-मैजिक तरीका नहीं है जो gg-plot2 को आउटलेयर और स्केल को होशियारी से बताए?
SFun28

38
Scale_y_continuous (सीमाएं = ...) के साथ सावधान रहें, यह उन डेटा को हटा देगा जो सीमा से बाहर आते हैं और फिर सांख्यिकीय गणना करते हैं। दूसरे शब्दों में माध्य और अन्य सारांश प्रभावित होंगे। यदि आप यही चाहते हैं, तो बहुत अच्छा है। वैकल्पिक है कि डेटा को हटाए बिना या सारांश को प्रभावित किए बिना, यह समन्वय_कार्टेशियन (सीमा = ...) का उपयोग करता है।
एंड्री

@ औररी - धन्यवाद! मैं मतलब नहीं है और अन्य सारांश प्रभावित होना चाहिए।
SFun28

1
coord_cartesian()coord_flip()मेरे अनुभव में अच्छा नहीं खेलता , इसलिए मैं पसंद करता हूं scale_y_continuous()
PatrickT

1
यह सबसे अच्छा उपाय है। कारण यह है कि मैं आउटलेर्स को छिपाना चाहता हूं, क्योंकि मैं जियोमिटर के साथ घबराने वाले बिंदुओं की भी साजिश कर रहा हूं। इस मामले में आउटलेयर बस रास्ते में आते हैं और यह देखते हैं कि वहाँ से अधिक अंक होने चाहिए।
विलियमसल्स

14

मेरे पास एक ही समस्या थी और Q1, Q2, मंझला, ymin, ymax का उपयोग करते हुए मानों को शामिल किया boxplot.stats :

# Load package and generate data
library(ggplot2)
data <- rnorm(100)

# Compute boxplot statistics
stats <- boxplot.stats(data)$stats
df <- data.frame(x="label1", ymin=stats[1], lower=stats[2], middle=stats[3], 
                 upper=stats[4], ymax=stats[5])

# Create plot
p <- ggplot(df, aes(x=x, lower=lower, upper=upper, middle=middle, ymin=ymin, 
                    ymax=ymax)) + 
    geom_boxplot(stat="identity")
p

परिणाम आउटलेर के बिना एक बॉक्सप्लॉट है। यहाँ छवि विवरण दर्ज करें


9

एक विचार दो-पास प्रक्रिया में डेटा को जीतना होगा :

  1. पहले पास को चलाएं, जानें कि सीमाएं क्या हैं, जैसे दिए गए प्रतिशत पर कटौती, या माध्य से ऊपर एन मानक विचलन, या ...

  2. एक दूसरे पास में, उस बाउंड के मान से दिए गए मान से परे मान सेट करें

मुझे इस बात पर जोर देना चाहिए कि यह एक पुराने जमाने की पद्धति है जिसमें अधिक आधुनिक मजबूत तकनीकों का वर्चस्व होना चाहिए, लेकिन आप अभी भी इसके पार आते हैं।


1
जिसने भी चुपचाप अपमानित किया है : टिप्पणी क्यों छोड़ें समझाने के लिए ।
डिर्क एडल्डबुलेटेल

मुझे नहीं था बस उस व्हिस्की को जोड़ना चाहते थे जो प्रतिशत (आमतौर पर 10 वें और 90 वें) पर रुकती है, पर्यावरण के आंकड़ों के साथ बहुत आम है।
रिची कॉटन

मैं एक मूक +1 था , और चाहता था कि मेरे पास एक और पेशकश हो। Winsorizing लगभग हमेशा econ + वित्त में किया जाता है। यदि SFun में डेटा विज़ुअलाइज़ेशन को बर्बाद करने वाले आउटलेर हैं, तो मुझे आश्चर्य है कि डेटा विश्लेषण पर उनका क्या प्रभाव है।
रिचर्ड हेरॉन

इस पोस्ट को फिर से पढ़ रहा था, आपने उल्लेख किया कि विंडसोराइजिंग एक पुरानी तकनीक है .... कुछ और आधुनिक तकनीकें क्या होंगी?
SFun28

1
सामान्य तौर पर, पिछले 30+ वर्षों के विकास के रूप में मजबूत तरीके।
डिर्क एडल्डबुलेटेल

2

Geom_boxplot फ़ंक्शन का "coef" विकल्प इंटरक्वेर्टाइल पर्वतमाला के संदर्भ में बाहरी कटऑफ़ को बदलने की अनुमति देता है। यह विकल्प फंक्शन stat_boxplot के लिए प्रलेखित है। आउटलेर को निष्क्रिय करने के लिए (दूसरे शब्दों में उन्हें नियमित डेटा के रूप में माना जाता है), कोई भी 1.5 के डिफ़ॉल्ट मान का उपयोग करने के बजाय एक बहुत ही उच्च कटऑफ मूल्य निर्दिष्ट कर सकता है:

library(ggplot2)
# generate data with outliers:
df = data.frame(x=1, y = c(-10, rnorm(100), 10)) 
# generate plot with increased cutoff for outliers:
ggplot(df, aes(x, y)) + geom_boxplot(coef=1e30)

3
यह सिर्फ मूंछों का विस्तार करता है, यह चार्ट को किसी भी तरह से नहीं
बदलता है

2

यदि आप व्हिस्कर्स को अधिकतम और न्यूनतम मानों तक विस्तारित करने के लिए बाध्य करना चाहते हैं, तो आप coefतर्क को मोड़ सकते हैं । डिफ़ॉल्ट मान coef1.5 है (यानी मूंछ की डिफ़ॉल्ट लंबाई IQR का 1.5 गुना है)।

# Load package and create a dummy data frame with outliers 
#(using example from Ramnath's answer above)
library(ggplot2)
df = data.frame(y = c(-100, rnorm(100), 100))

# create boxplot that includes outliers
p0 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)))

# create boxplot where whiskers extend to max and min values
p1 = ggplot(df, aes(y = y)) + geom_boxplot(aes(x = factor(1)), coef = 500)

p0 की छवि

पी 1 की छवि


2

एम्पियर :: geom_boxplot2 सिर्फ वही है जो आप चाहते हैं।

# devtools::install_github('kongdd/Ipaper')
library(Ipaper)
library(ggplot2)
p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot2(width = 0.8, width.errorbar = 0.5)

यहाँ छवि विवरण दर्ज करें


धन्यवाद!! मेरे डेटा के साथ परीक्षण किया गया, पूर्णता से काम कर रहा है! मैं इस समाधान की सिफारिश करूंगा, हालांकि मैं गितुब चीजों की स्थिरता / लंबे समय के समर्थन के बारे में निश्चित नहीं हूं।
गिलदास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.