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

问题描述 投票:0回答:2

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

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()

谢谢!!

r ggplot2 boxplot jitter
2个回答
17
投票

这与上面的方法略有不同(为非异常值分配带有 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”颜色,并且不会出现在图中。

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

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()


17
投票

向数据集中添加了一个向量,以指示哪些点是异常值,哪些不是异常值。然后,将

geom_boxplot
设置为不绘制任何异常值,并使用
geom_point
明确绘制异常值。

我将使用

diamonds
中的
ggplot2
数据集来说明。

编辑以更正异常值定义

library(ggplot2)
library(dplyr)

diamonds2 <-
  diamonds %>%
  group_by(cut) %>%
  mutate(
         outlier_lwr = price < quantile(price, probs = 0.25) - IQR(price) * 1.5,
         outlier_upr = price > quantile(price, probs = 0.75) + IQR(price) * 1.5
         ) %>%
  ungroup

ggplot(diamonds2) +
  aes(x = cut, y = price) +
  geom_boxplot(outlier.shape = NA) +  # NO OUTLIERS
  geom_point(data = function(x) subset(x, outlier_lwr | outlier_upr), 
             position = 'jitter') # Outliers

© www.soinside.com 2019 - 2024. All rights reserved.