आर

2015-11-04 7 views
8

में बॉक्सप्लॉट्स के लेबलिंग आउटलाइजर्स मेरे पास कोड है जो जी में प्लॉट जीजीप्लॉट का उपयोग करके बॉक्सप्लॉट बनाता है, मैं अपने आउटलायर को वर्ष और युद्ध के साथ लेबल करना चाहता हूं।आर

यहाँ मेरी कोड मेरी boxplot

require(ggplot2) 
ggplot(seabattle, aes(x=PortugesOutcome,y=RatioPort2Dutch),xlim="OutCome", 
y="Ratio of Portuguese to Dutch/British ships") + 
geom_boxplot(outlier.size=2,outlier.colour="green") + 
stat_summary(fun.y="mean", geom = "point", shape=23, size =3, fill="pink") + 
ggtitle("Portugese Sea Battles") 

किसी को भी मदद कर सकते हैं बनाने के लिए है? मुझे पता था कि यह सही है, मैं सिर्फ आउटलाइर्स को लेबल करना चाहता हूं।

+2

कहाँ डेटा 'seabattle' से आता है? क्या आप इस उदाहरण को पुन: उत्पन्न करने के लिए डेटा को 'dput' कर सकते हैं या नमूना डेटा प्रदान कर सकते हैं? – JasonAizkalns

+0

क्या आप पहले से ही कोशिश कर चुके हैं? – Heroka

उत्तर

5

क्या यह आपके लिए काम करता है?

library(ggplot2) 
library(data.table) 

#generate some data 
set.seed(123) 
n=500 
dat <- data.table(group=c("A","B"),value=rnorm(n)) 

ggplot बॉक्स की सीमाओं से है कि> 1.5 * IQR कुछ के रूप में डिफ़ॉल्ट रूप से एक बाहरी परिभाषित करता है।

#function that takes in vector of data and a coefficient, 
#returns boolean vector if a certain point is an outlier or not 
check_outlier <- function(v, coef=1.5){ 
    quantiles <- quantile(v,probs=c(0.25,0.75)) 
    IQR <- quantiles[2]-quantiles[1] 
    res <- v < (quantiles[1]-coef*IQR)|v > (quantiles[2]+coef*IQR) 
    return(res) 
} 

#apply this to our data 
dat[,outlier:=check_outlier(value),by=group] 
dat[,label:=ifelse(outlier,"label","")] 

#plot 
ggplot(dat,aes(x=group,y=value))+geom_boxplot()+geom_text(aes(label=label),hjust=-0.3) 

enter image description here

10

निम्नलिखित एक प्रतिलिपि प्रस्तुत करने योग्य समाधान dplyr का उपयोग करता है और है निर्मित mtcars डाटासेट।

कोड के माध्यम से चलना: सबसे पहले, एक फ़ंक्शन, is_outlier बनाएं जो एक बूलियन TRUE/FALSE लौटाएगा यदि यह मान पास हो गया है तो यह एक बाहरी है। इसके बाद हम "विश्लेषण/जांच" करते हैं और डेटा प्लॉट करते हैं - पहले हम group_by हमारे चर में (cyl इस उदाहरण में, यह आपके उदाहरण में PortugesOutcome होगा) और हम mutate पर कॉल में एक चर outlier जोड़ते हैं (यदि drat परिवर्तनीय एक बाहरी है [नोट यह आपके उदाहरण में RatioPort2Dutch से मेल खाता है], हम drat मान पास करेंगे, अन्यथा हम NA वापस कर देंगे ताकि मूल्य प्लॉट नहीं किया जा सके)। अंत में, हम परिणामों को साजिश करते हैं और पाठ मूल्यों को geom_text और हमारे नए चर के बराबर एक सौंदर्य लेबल के माध्यम से साजिश करते हैं; इसके अलावा, हम hjust के साथ पाठ को ऑफ़सेट करते हैं (इसे दाईं ओर स्लाइड करें) ताकि हम बाहरी बिंदुओं के शीर्ष के बजाय, आगे के मान देख सकें।

library(dplyr) 
library(ggplot2) 

is_outlier <- function(x) { 
    return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x)) 
} 

mtcars %>% 
    group_by(cyl) %>% 
    mutate(outlier = ifelse(is_outlier(drat), drat, as.numeric(NA))) %>% 
    ggplot(., aes(x = factor(cyl), y = drat)) + 
    geom_boxplot() + 
    geom_text(aes(label = outlier), na.rm = TRUE, hjust = -0.3) 

Boxplot

-2
@JasonAizkalns समाधान आप अपने डेटा फ्रेम में अपने स्थान के साथ बाहरी कारकों के लेबल कर सकते हैं पर एक छोटा सा मोड़ के साथ

mtcars[,'row'] <- row(mtcars)[,1] 
... 
mutate(outlier = ifelse(is_outlier(drat), row, as.numeric(NA))) 
... 

मैं आर स्टूडियो पर्यावरण में डेटा फ्रेम लोड करते हैं, तो मैं तो बाहरी पंक्तियों में डेटा को करीब से देख ले जा सकते हैं।

2

(JasonAizkalns उत्तर के आधार पर) rownames साथ बाहरी कारकों के लेबल करने के लिए

library(dplyr) 
library(ggplot2) 
library(tibble) 

is_outlier <- function(x) { 
    return(x < quantile(x, 0.25) - 1.5 * IQR(x) | x > quantile(x, 0.75) + 1.5 * IQR(x)) 
} 

dat <- mtcars %>% tibble::rownames_to_column(var="outlier") %>% group_by(cyl) %>% mutate(is_outlier=ifelse(is_outlier(drat), drat, as.numeric(NA))) 
dat$outlier[which(is.na(dat$is_outlier))] <- as.numeric(NA) 

ggplot(dat, aes(y=drat, x=factor(cyl))) + geom_boxplot() + geom_text(aes(label=outlier),na.rm=TRUE,nudge_y=0.05) 

boxplot with outliers name