gpt4 book ai didi

r - 如果 ggplot2 箱线图中存在多个异常值,则出现抖动

转载 作者:行者123 更新时间:2023-12-02 21:15:00 29 4
gpt4 key购买 nike

我正在尝试找到合适的显示器来说明学校类(class)内和类(class)之间的各种属性。每个类(class)只有 15-30 个数据点(学生)。

现在我倾向于无须箱线图,仅显示 1.,2。 3. 四分位数 + 数据点,例如1 总体 SD +/- 样本中位数。

这个我能做到。

但是 - 我需要向一些老师展示此图表,以了解他们最喜欢什么。我想将我的图表与普通箱线图进行比较。但如果只有一个异常值,或者例如,正常的箱线图看起来是一样的。 5 个相同值的异常值。在这种情况下,这将破坏交易。

例如

test <-structure(list(value = c(3, 5, 3, 3, 6, 4, 5, 4, 6, 4, 6, 4, 
4, 6, 5, 3, 3, 4, 4, 4, 3, 4, 4, 4, 3, 4, 5, 6, 6, 4, 3, 5, 4,
6, 5, 6, 4, 5, 5, 3, 4, 4, 6, 4, 4, 5, 5, 3, 4, 5, 8, 8, 8, 8,
9, 6, 6, 7, 6, 9), places = structure(c(1L, 2L, 1L, 1L, 1L, 2L,
1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L,
2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L,
2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L,
1L, 2L, 2L, 1L, 2L, 1L), .Label = c("a", "b"), class = "factor")), .Names = c("value",
"places"), row.names = c(NA, -60L), class = "data.frame")

ggplot(test, aes(x=places,y=value))+geom_boxplot()

此处 ("a",9) 处有两个异常值 - 但仅显示一个“点”。

所以我的问题是:如何抖动异常值。并且 - 对于此类数据,您建议采用哪种显示方式?

最佳答案

可以重新定义函数

GeomBoxplot$draw<-function (., data, ..., outlier.colour = "black", outlier.shape = 16, 
outlier.size = 2, outlier.jitter=0)
{
defaults <- with(data, data.frame(x = x, xmin = xmin, xmax = xmax,
colour = colour, size = size, linetype = 1, group = 1,
alpha = 1, fill = alpha(fill, alpha), stringsAsFactors = FALSE))
defaults2 <- defaults[c(1, 1), ]
if (!is.null(data$outliers) && length(data$outliers[[1]] >=
1)) {
pp<-position_jitter(width=outlier.jitter,height=0)
p<-pp$adjust(data.frame(x=data$x[rep(1, length(data$outliers[[1]]))], y=data$outliers[[1]]),.scale)
outliers_grob <- GeomPoint$draw(data.frame(x=p$x, y = p$y, colour = I(outlier.colour),
shape = outlier.shape, alpha = 1, size = outlier.size,
fill = NA), ...)
}
else {
outliers_grob <- NULL
}
with(data, ggname(.$my_name(), grobTree(outliers_grob, GeomPath$draw(data.frame(y = c(upper,
ymax), defaults2), ...), GeomPath$draw(data.frame(y = c(lower,
ymin), defaults2), ...), GeomRect$draw(data.frame(ymax = upper,
ymin = lower, defaults), ...), GeomRect$draw(data.frame(ymax = middle,
ymin = middle, defaults), ...))))
}

ggplot(test, aes(x=places,y=value))+geom_boxplot(outlier.jitter=0.05)

这是临时解决方案。当然,从OOP的意义上来说,您应该创建GeomBoxplot的子类并重写该函数。这很容易,因为 ggplot2 很好。

===添加了子类定义的示例===

GeomBoxplotJitterOutlier <- proto(GeomBoxplot, {
draw <- function (., data, ..., outlier.colour = "black", outlier.shape = 16,
outlier.size = 2, outlier.jitter=0) {
# copy the body of function 'draw' above and paste here.
}

objname <- "boxplot_jitter_outlier"
desc <- "Box and whiskers plot with jittered outlier"
guide_geom <- function(.) "boxplot_jitter_outlier"

})
geom_boxplot_jitter_outlier <- GeomBoxplotJitterOutlier$build_accessor()

然后你可以用你的子类来做:

ggplot(test, aes(x=places,y=value))+geom_boxplot_jitter_outlier(outlier.jitter=0.05)

关于r - 如果 ggplot2 箱线图中存在多个异常值,则出现抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3010403/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com