使用ggplot2将抖动应用于箱线图中的异常值数据

Jac*_*ack 8 r ggplot2 boxplot jitter

您是否知道如何将抖动应用于箱线图的异常数据?这是代码

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()
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Pet*_*ter 9

在数据集中添加了一个向量,以指示哪些点是异常值,哪些不是异常值.然后,设置geom_boxplot为不绘制任何异常值并使用a 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 我从未见过在 `data = ` 参数中使用过的函数;那太好了! (3认同)
  • 稍微扩展一下 Matt L 的评论(在他们的答案中得到了解决):Peter 对外围值截止的规范与 Tukey 约定略有不同。Tukey 惯例是上/下四分位数 +- 1.5*IQR,但 Peter 使用中位数 +- 1.5*IQR。彼得的答案也只涉及极高的值,而忽略极小的值。 (3认同)
  • 离群值的默认值有点偏离,所以点与胡须重叠......使用:`outlier.high = V8 &gt; quantile(V8, .75) + 1.50*IQR(V8)`和`outlier.low = V8 &lt; 分位数(V8, .25) - 1.50*IQR(V8))`。然后可以添加`geom_jitter(data = filter(a, outlier.high ==T | outlier.low == T), color = "red", width = .2)` (2认同)

Mat*_* L. 7

这与上面的方法稍有不同(为非离群值指定一个带有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)))
Run Code Online (Sandbox Code Playgroud)

计算上限/下限异常值(使用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))
Run Code Online (Sandbox Code Playgroud)

定义上/下点的颜色:

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

未分类的案例将被编码为颜色的"NA",并且不会出现在图中.

dplyr::case_when()函数尚未完全稳定(在此处输入链接描述可能需要github开发版本> 0.5 ),因此如果不起作用,这里有一个基本替代方法:

a$outlier.color <- NA
a$outlier.color[a$outlier.high] <- "red"
a$outlier.color[a$outlier.low] <- "steelblue"
Run Code Online (Sandbox Code Playgroud)

情节:

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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述