如何在 R 中使用 geom_boxplot() + geom_jitter() 绘图时排除异常值

3

我有一个名为mpg的数据集。我想绘制一个箱线图(上面带有点),以查看变量drv(驱动类型)和cty(城市里程每加仑)之间的关系。

以下是我的代码:

ggplot(data=mpg,mapping=aes(x=drv,y=cty))+geom_boxplot(outlier.shape = NA)+geom_jitter()

有没有一种方法可以从geom_jitter()中排除异常值?

Plot


geom_jitter()本身没有丢弃异常值的参数。您需要手动筛选要绘制的数据点或手动定义哪些点是异常值,然后再将其输入到geom_jitter()中。 - Nuclear03020704
2个回答

4

您可以使用outlier.shape=NA来隐藏geom_boxplot的异常值。对于geom_jitter,您可以使用透明度来隐藏异常值,但这些异常值需要先进行定义。

mpg %>%
  group_by(drv) %>%
  mutate(cty.show = as.numeric(  # so ggplot doesn't complain about alpha being discrete
    between(cty, 
            quantile(cty)[2] - 1.5*IQR(cty),
            quantile(cty)[4] + 1.5*IQR(cty)))) %>% 
  ggplot(aes(drv, cty)) + 
  geom_boxplot(outlier.shape = NA) + 
  geom_jitter(aes(alpha=cty.show), show.legend=FALSE) +
  scale_alpha_continuous(range = c(0, 1)) # otherwise outliers only partially transparent.

enter image description here

对于第二个图,如果需要的话可以调整y轴限制。

1
我认为透明度选项很好 - 如果绘图中的个别点看起来像是被完全审查了,我会感到不舒服。 - Mark Neal

3

geom_jitter()本身没有丢弃异常值的参数。您需要通过定义哪些点是异常值来手动过滤要绘制的数据点。

library(dplyr)
library(ggplot2)

mpg %>%
  group_by(drv) %>%
  mutate(cty_filtered = case_when(cty - quantile(cty)[4] > 1.5*IQR(cty) ~ NA_real_,
                                  quantile(cty)[2] - cty > 1.5*IQR(cty) ~ NA_real_,
                                  TRUE ~ cty)) %>%
  ggplot() + geom_boxplot(aes(drv, cty)) + geom_jitter(aes(drv, cty_filtered))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接