我怎样才能在颜色的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)))
为了上色离群点与您的箱线图,你会需要计算的异常值,并分别绘制出来。 据我所知,着色异常颜色都异常同色系的内置选项。
帮助文件示例
使用相同的数据“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
更新(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 ()
我张贴这是一个迟到的回答,因为我发现自己一次又一次地寻找这件事,我的贴吧也为相关问题的箱形图,如何搭配离群颜色填充美学?
我找到了解决的事实,设置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箱线图,我怎么搭配离群颜色填充美学?
如果有必要根据不同的因素来改变离群点的形状或颜色(不一样的,其被用于制造箱线组)然后@Dinre的答案可以适应。
点的颜色可如果不用于箱线图本身(你不能使用颜色两个变量)的颜色才改变。
使用数据plot_Data
和代码从@Dinre答案-异常的颜色取决于因素carb
。 通过添加参数outlier.shape = NA
到geom_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)))
离群值自动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)
```
箱形图
万一你真的想保持框黑色:
另一种可能的解决方案是
- 存储在变量中的一个点是否是异常值,
- 抑制异常值与标绘
outlier.color = NA
,并 - 情节只有那些离群值,并使用这些点
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()
调用(最后一行),以免所有点标绘。