2015-11-04 87 views
8

我有創建boxplot的代碼,在R中使用ggplot,我想用年度和戰鬥標記我的異常值。在R中標註Boxlot的異常值

這裏是我的代碼來創建我的箱線圖

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'從何而來?你能輸入數據還是提供樣本數據,以使這個例子具有可重現性? – 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))) 
... 

我將數據框加載到R Studio環境中,然後我可以仔細看看異常行中的數據。

2

爲了標記離羣值rownames(基於JasonAizkalns答案)

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