2017-05-23 39 views
2

您是否有任何想法將抖動僅應用於boxplot的異常值數據?這是密碼將抖動應用於帶有ggplot2的boxplot中的異常值數據

ggplot(data = a, aes(x = "", y = a$V8)) + geom_boxplot(outlier.size = 
0.5)+ geom_point(data=a, aes(x="", y=a$V8[54]), colour="red", size=3) + 
theme_bw() +coord_flip() 

謝謝!!

+1

你能給我們一個可重複的例子嗎? –

回答

3

向您的數據集添加了一個向量,以指示哪些點不是異常值。然後,設置geom_boxplot以不繪製任何異常值,並使用geom_point來繪製異常值的明確值。

我會用diamonds數據集從ggplot2來說明。

library(ggplot2) 
library(dplyr) 

diamonds2 <- 
    diamonds %>% 
    group_by(cut) %>% 
    mutate(outlier = price > median(price) + IQR(price) * 1.5) %>% 
    ungroup 

ggplot(diamonds2) + 
    aes(x = cut, y = price) + 
    geom_boxplot(outlier.shape = NA) + # NO OUTLIERS 
    geom_point(data = function(x) dplyr::filter_(x, ~ outlier), position = 'jitter') # Outliers 

enter image description here

+0

我從來沒有見過'data ='參數中使用的函數;太精彩了! – Brian

+0

離羣值的默認值有點偏離,所以這些點與鬍鬚重疊...使用:'outlier.high = V8>分位數(V8,.75)+ 1.50 * IQR(V8)'和'outlier.low = V8 <分位數(V8,.25) - 1.50 * IQR(V8))'。然後可以添加'geom_jitter(data = filter(a,outlier.high == T | outlier.low == T),color =「red」,width = .2)' –

2

這是稍微不同的方法比上述(分配與NA顏色變量針對非離羣值),並且包括用於所述上限和下限的計算的校正。

默認的「離羣值」定義是超出25/75四分位數+/- 1.5 x四分位距離(IQR)的點。

生成一些示例數據:

set.seed(1) 
a <- data_frame(x= factor(rep(1:4, each = 1000)), 
       V8 = c(rnorm(1000, 25, 4), 
         rnorm(1000, 50, 4), 
         rnorm(1000, 75, 4), 
         rnorm(1000, 100, 4))) 

計算上限/下限的異常值(採用dplyr/tidyverse函數):

library(tidyverse) 
a <- a %>% group_by(x) %>% 
    mutate(outlier.high = V8 > quantile(V8, .75) + 1.50*IQR(V8), 
     outlier.low = V8 < quantile(V8, .25) - 1.50*IQR(V8)) 

定義顏色用於上/下幾點:

a <- a %>% mutate(outlier.color = case_when(outlier.high ~ "red", 
             outlier.low ~ "steelblue")) 

未分類的案例將被編碼爲「NA」顏色,a nd不會出現在劇情中。

dplyr::case_when()功能並不完全穩定,但(可能需要GitHub的開發版> 0.5的enter link description here),所以這裏是一個基礎的選擇,如果不工作:

a$outlier.color <- NA 
a$outlier.color[a$outlier.high] <- "red" 
a$outlier.color[a$outlier.low] <- "steelblue" 

簡介:

a %>% ggplot(aes(x, V8)) + 
    geom_boxplot(outlier.shape = NA) + 
    geom_jitter(color = a$outlier.color, width = .2) + # NA not plotted 
    theme_bw() + coord_flip() 

enter image description here