为了上色离群点与您的箱线图,你会需要计算离群值并分别绘制它们。据我所知,用于着色异常值的内置选项使所有异常值都具有相同的颜色。
帮助文件例如
使用相同的数据 'geom_boxplot' 帮助文件:
ggplot(mtcars, aes(x=factor(cyl), y=mpg, col=factor(cyl))) +
geom_boxplot()
着色离群点
现在有可能是更简化的方式来做t他的,但我更喜欢手动计算事情,所以我不必猜测发生了什么。使用“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)
说明书告诉为“CYL”值中的每个分组进行计算的功能。
此时,我们现在可以绘制boxplot,然后用新的彩色点覆盖异常值。
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”层,然后将使用独立的数据箱线图和点的几何形状。 boxplot几何可以使用原始数据框,但我正在使用我们新的'plot_Data'以保持一致。点几何图形然后仅使用我们的新'lower.limit'和'upper.limit'列来确定异常点,以确定异常点状态。由于我们对'x'和'col'美学参数使用了相同的规范,所以颜色在箱形图和相应的离群值点之间神奇地匹配。
更新: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'数据中每个'cyl'值的下限和上限。我们可以编写一个'for'循环或其他语句来计算这些值,但之后我们必须编写另一个逻辑块来评估异常状态。相反,我们希望使用'ddply'来计算下限和上限,并将这些值添加到每一行。我们选择'ddply'(而不是'dlply','d_ply'等),因为我们输入一个数据帧并且想要一个数据帧作为输出。这给了我们:
ddply(
我们希望将“mtcars”数据帧上执行语句,所以我们补充说。
ddply(mtcars,
现在,我们要使用'cyl'值作为分组变量来执行我们的计算。我们使用“plyr”功能.()
引用变量本身,而不是变量的值,比如:
ddply(mtcars, .(cyl),
下一个参数指定函数适用于每个组。我们希望计算为旧数据添加新行,因此我们选择“mutate”函数。这将保留旧数据并将新计算添加为新列。这与“汇总”等其他功能形成了对比,“汇总”功能可删除除分组变量之外的所有旧列。
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',这很容易使用'mutate'功能。
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
只给一个对比,如果我们要用'summarize'函数做同样的'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
你可以发布一个代码示例,为人们从工作?这将鼓励更多有用的答案。 – Dinre 2013-03-07 14:03:27
@Dinre:好点,添加示例 – user248237dfsf 2013-03-07 14:44:48