在GGPLOT2着色箱线图离群点?(Coloring boxplot outlier points

2019-07-21 03:52发布

我怎样才能在颜色的GGPLOT2离群点? 我想他们是在颜色箱线图本身相同。 colour=不足以做到这一点。

例:

p <- ggplot(mtcars, aes(factor(cyl), mpg))
p + geom_boxplot(aes(colour=factor(cyl)))

我想作为着色异常值factor(cyl)为好。 这不起作用:

> p <- ggplot(mtcars, aes(factor(cyl), mpg))
> p + geom_boxplot(aes(colour=factor(cyl), outlier.colour=factor(cyl)))

Answer 1:

为了上色离群点与您的箱线图,你会需要计算的异常值,并分别绘制出来。 据我所知,着色异常颜色都异常同色系的内置选项。

帮助文件示例

使用相同的数据“geom_boxplot”帮助文件:

ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl))) +
    geom_boxplot()

着色离群点

现在有可能做到这一点更精简的方式,但我更喜欢用手工计算的东西,所以我不必去猜测什么引擎盖下回事。 使用“plyr”包,我们可以迅速得到上限和下限为使用默认的用于确定孤立点,其在该范围之外的任何点(图基)方法[Q1 - 1.5 * IQR,Q3 + 1.5 * IQR]。 Q1和Q3是数据的1/4和3/4分位数,和IQR = Q3 - Q1。 我们可以写这一切作为一个巨大的语句,但由于“plyr”包装的“变异”功能将让我们引用新创建的列,我们不妨起来把它分解为更容易阅读/调试,就像这样:

library(plyr)
plot_Data <- ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)

我们使用“ddply”功能,因为我们正在输入的数据帧,并希望的数据帧作为输出(“D-> d”帘布层)。 在上述“ddply”语句的“发生变异”功能被保留原始数据帧并添加额外的列,并且的规格.(cyl)说的是功能的“缸”值中的每个分组进行计算。

在这一点上,我们现在可以绘制箱线图,然后用新的,颜色点覆盖异常值。

ggplot() +
    geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg, col=factor(cyl))) + 
    geom_point(data=plot_Data[plot_Data$mpg > plot_Data$upper.limit | plot_Data$mpg < plot_Data$lower.limit,], aes(x=factor(cyl), y=mpg, col=factor(cyl)))

我们正在做的代码是指定一个空的“ggplot”层,使用独立的数据相加箱线图和点的几何形状。 箱线图的几何形状可以使用原始数据帧,但我使用我们新的“plot_Data”是一致的。 该点的几何形状,然后只绘制离群点,用我们的新的“lower.limit”和“upper.limit”列,以确定异常状态。 由于我们使用相同规格的“x”和“关口”美学参数,颜色神奇的盒形图和相应的离群点之间的匹配。

更新 :OP请求在这段代码中使用了“ddply”功能更完整的解释。 这里是:

功能的“plyr”家庭基本上子集划分数据和对数据的每个子集执行功能的一种方式。 在这种特殊情况下,我们的声明:

ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)

让我们打破这在声明将被写入的顺序。 首先,“ddply”功能的选择。 我们要计算在“mtcars”数据“团”的每一个值的上限和下限。 我们可以写一个“for”循环或其他语句来计算这些值,但随后我们将不得不另写逻辑块后评估异常状态。 相反,我们想用“ddply”来计算的上限和下限,并将这些值添加到每个行。 我们选择“ddply”(而不是“dlply”,“d_ply”等),因为我们正在输入的数据帧和想要的数据帧输出。 这给了我们:

ddply(

我们希望将“mtcars”数据帧上执行语句,所以我们补充说。

ddply(mtcars, 

现在,我们要执行用“团”值我们的计算为分组变量。 我们使用“plyr”功能.()来引用变量本身,而不是变量的值,如下所示:

ddply(mtcars, .(cyl),

接下来的参数指定适用于每个组的功能。 我们希望我们的计算,以新行添加到旧的数据,所以我们选择了“发生变异”功能。 这将保留旧的数据,并增加了新的计算作为新列。 这是相对于如“总结”,其除去所有旧的列以外的分组varaible(多个)其他功能。

ddply(mtcars, .(cyl), mutate, 

最后一系列的参数都是我们要创建数据的新列。 我们通过指定一个名字(无引号)和表达式定义这些。 首先,我们创建了“Q1”列。

ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), 

在“Q3”列类似地计算。

ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), 

幸运的是,与“发生变异”功能,我们可以使用新创建的列,其他列的定义的一部分。 这让我们可以写一个巨大的函数或不必运行多个功能。 我们需要在四分位数间距为“IQR”变量的计算中使用的“Q1”和“Q3”,这很容易与“发生变异”功能。

ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, 

我们终于在这里我们想现在就可以。 我们在技术上并不需要的“Q1”,“Q3”和“IQR”列,但它确实让我们的下限和上限方程一个更容易阅读和调试。 我们可以写我们的表现就像理论公式: limits=+/- 1.5 * IQR

ddply(mtcars, .(cyl), mutate, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)

切割出来的可读性中柱,这就是新的数据帧的样子:

plot_Data[, c(-3:-11)]
#     mpg cyl    Q1    Q3  IQR upper.limit lower.limit
# 1  22.8   4 22.80 30.40 7.60      41.800      11.400
# 2  24.4   4 22.80 30.40 7.60      41.800      11.400
# 3  22.8   4 22.80 30.40 7.60      41.800      11.400
# 4  32.4   4 22.80 30.40 7.60      41.800      11.400
# 5  30.4   4 22.80 30.40 7.60      41.800      11.400
# 6  33.9   4 22.80 30.40 7.60      41.800      11.400
# 7  21.5   4 22.80 30.40 7.60      41.800      11.400
# 8  27.3   4 22.80 30.40 7.60      41.800      11.400
# 9  26.0   4 22.80 30.40 7.60      41.800      11.400
# 10 30.4   4 22.80 30.40 7.60      41.800      11.400
# 11 21.4   4 22.80 30.40 7.60      41.800      11.400
# 12 21.0   6 18.65 21.00 2.35      24.525      15.125
# 13 21.0   6 18.65 21.00 2.35      24.525      15.125
# 14 21.4   6 18.65 21.00 2.35      24.525      15.125
# 15 18.1   6 18.65 21.00 2.35      24.525      15.125
# 16 19.2   6 18.65 21.00 2.35      24.525      15.125
# 17 17.8   6 18.65 21.00 2.35      24.525      15.125
# 18 19.7   6 18.65 21.00 2.35      24.525      15.125
# 19 18.7   8 14.40 16.25 1.85      19.025      11.625
# 20 14.3   8 14.40 16.25 1.85      19.025      11.625
# 21 16.4   8 14.40 16.25 1.85      19.025      11.625
# 22 17.3   8 14.40 16.25 1.85      19.025      11.625
# 23 15.2   8 14.40 16.25 1.85      19.025      11.625
# 24 10.4   8 14.40 16.25 1.85      19.025      11.625
# 25 10.4   8 14.40 16.25 1.85      19.025      11.625
# 26 14.7   8 14.40 16.25 1.85      19.025      11.625
# 27 15.5   8 14.40 16.25 1.85      19.025      11.625
# 28 15.2   8 14.40 16.25 1.85      19.025      11.625
# 29 13.3   8 14.40 16.25 1.85      19.025      11.625
# 30 19.2   8 14.40 16.25 1.85      19.025      11.625
# 31 15.8   8 14.40 16.25 1.85      19.025      11.625
# 32 15.0   8 14.40 16.25 1.85      19.025      11.625

只是为了给一个对比,如果我们做同样的“ddply”语句的“总结”功能,相反,我们将有所有相同的答案,但没有其他数据的列。

ddply(mtcars, .(cyl), summarize, Q1=quantile(mpg, 1/4), Q3=quantile(mpg, 3/4), IQR=Q3-Q1, upper.limit=Q3+1.5*IQR, lower.limit=Q1-1.5*IQR)
#   cyl    Q1    Q3  IQR upper.limit lower.limit
# 1   4 22.80 30.40 7.60      41.800      11.400
# 2   6 18.65 21.00 2.35      24.525      15.125
# 3   8 14.40 16.25 1.85      19.025      11.625


Answer 2:

更新(2015年3月31日):看@ TARCH对解决ggplot2 > = 1.0.0

对于溶液ggplot2 <= 0.9.3如下。


正如@koshke所述,具有着色像箱(未填充颜色)的线的异常值是现在通过设置容易地outlier.colour = NULL

p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl)))
p + geom_boxplot(outlier.colour = NULL)

  • outlier.colour必须以“OU”被写入
  • outlier.colour必须是外aes ()

我张贴这是一个迟到的回答,因为我发现自己一次又一次地寻找这件事,我的贴吧也为相关问题的箱形图,如何搭配离群颜色填充美学?



Answer 3:

我找到了解决的事实,设置geom_boxplot(outlier.colour = NULL)并不R中的最新版(@hamy谈到GGPLOT2的1.0.0版本)工作了。

为了复制这种@cbeleites提出的行为,你只需要使用下面的代码:

update_geom_defaults("point", list(colour = NULL))
m <- ggplot(movies, aes(y = votes, x = factor(round(rating)),
            colour = factor(Animation)))
m + geom_boxplot() + scale_y_log10()

预期这将产生相匹配的线颜色点的情节。

当然,人们应该记住,恢复默认值,如果他需要借助多条曲线:

update_geom_defaults("point", list(colour = "black"))

发现该溶液通过读取GGPLOT2的changelog在GitHub上:

的异常值geom_boxplot()使用默认的颜色,大小和形状由geom_point() 更改的默认geom_point()update_geom_defaults()将适用于的异常值相同的变化geom_boxplot() 更改为异常值的默认值是以前不可能的。 (@ThierryO,#757)

在这里发布,以及: GGPLOT2箱线图,我怎么搭配离群颜色填充美学?



Answer 4:

如果有必要根据不同的因素来改变离群点的形状或颜色(不一样的,其被用于制造箱线组)然后@Dinre的答案可以适应。

点的颜色可如果不用于箱线图本身(你不能使用颜色两个变量)的颜色才改变。

使用数据plot_Data和代码从@Dinre答案-异常的颜色取决于因素carb 。 通过添加参数outlier.shape = NAgeom_boxplot()被去除原始离群值,以确保它们没有过度绘制由geom_point()

ggplot() +
  geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg),outlier.shape = NA) + 
  geom_point(data=plot_Data[plot_Data$mpg > plot_Data$upper.limit | 
                              plot_Data$mpg < plot_Data$lower.limit,], 
             aes(x=factor(cyl), y=mpg, color=factor(carb)))

要更改点的形状:

ggplot() +
  geom_boxplot(data=plot_Data, aes(x=factor(cyl), y=mpg),outlier.shape = NA) + 
  geom_point(data=plot_Data[plot_Data$mpg > plot_Data$upper.limit | 
                              plot_Data$mpg < plot_Data$lower.limit,], 
             aes(x=factor(cyl), y=mpg, shape=factor(carb)))



Answer 5:

离群值自动GGPLOT2 * 1.0.1.9003再次继承了框的颜色。

https://github.com/hadley/ggplot2/issues/1400

```{r}
library(ggplot2)
point_size=10
ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl))) +
geom_boxplot(outlier.size = point_size)
```

箱形图



Answer 6:

万一你真的想保持框黑色:

另一种可能的解决方案是

  1. 存储在变量中的一个点是否是异常值,
  2. 抑制异常值与标绘outlier.color = NA ,并
  3. 情节只有那些离群值,并使用这些点col审美在此调用geom_point()

步骤1:定义一个函数来确定点是否是异常值:

is.outlier <- function (x) {
  x < quantile(x, .25) - 1.5 * IQR(x) |
    x > quantile(x, .75) + 1.5 * IQR(x)
}

步骤2:组数据,并计算与异常值这个函数为基

diamonds %>% group_by(cut) %>%
  mutate(outlier.p = is.outlier(price)) %>%
  ungroup() -> diamonds

第3步:创建情节

ggplot(diamonds, aes(x = cut, y = price, fill = cut)) +
  geom_boxplot(outlier.color = NA) +
  geom_point(data = diamonds[diamonds$outlier.p,], aes(col = cut))

请注意,您必须子集数据集在geom_point()调用(最后一行),以免所有点标绘。



文章来源: Coloring boxplot outlier points in ggplot2?