[英]boxplot of all columns of a matrix with ggplot and geom_boxplot() via aes()
[英]ggplot geom_boxplot middle aes no effect
我正在尝试使用 ggplot2 绘制箱线图。 我想改变中间的意思。
我知道以前有人问过类似的问题,但我问这个是因为该解决方案对我不起作用。 具体来说,我遵循了这个接受的答案中的第一个解决方案
这就是我对 mpg 测试数据所做的:
library(ggplot2)
library(tidyverse)
mpg %>%
ggplot(aes(x = class, y = cty, middle = mean(cty))) +
geom_boxplot()
它没有效果。
谁能帮忙指出我做错了什么? 谢谢。
使用另一个数据集mtcars
显示相同的内容,定义middle
不会改变它。 而且那个在均值与中位数上有一些更大的差异。 另一种选择是使用stat_summary
,尽管我无法让 points 函数恰到好处地工作,并且不得不对其进行调整,以免得到arguments imply differing number of rows: 1, 0
错误。
BoxMeanQuant <- function(x) {
v <- c(min(x), quantile(x, 0.25), mean(x), quantile(x, 0.75), max(x))
names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
v
}
mpg %>%
ggplot(aes(x = class, y = cty)) +
stat_summary(fun.data = BoxMeanQuant, geom = "boxplot")
与不使用定义的middle
的普通geom_boxplot
相比。
mpg %>%
ggplot(aes(x = class, y = cty)) +
geom_boxplot(aes(middle = mean(cty)))
这是我用来将异常值绘制为点的方法,但它们与geom_boxplot
的默认值不同。 您可以根据需要进行调整。 如果不使用if-else
它会抛出错误。
BoxMeanQuant <- function(x) {
v <- c(quantile(x, 0.1), quantile(x, 0.25), mean(x), quantile(x, 0.75), quantile(x, 0.9))
names(v) <- c("ymin", "lower", "middle", "upper", "ymax")
v
}
outliers <- function(x) {
if (length(x) > 5) {
subset(x, x < quantile(x, 0.1) | quantile(x, 0.9) < x)
} else {
return(NA)
}
}
ggplot(data = mpg, aes(x = class, y = cty)) +
stat_summary(fun.data = BoxMeanQuant, geom = "boxplot") +
stat_summary(fun.y = outliers, geom = "point")
最后,我不得不创建一个摘要 df 来做到这一点。 这不是我最初寻找的,但它有效。
df <- mpg %>%
group_by(class) %>%
summarize(ymin = min(cty), ymax = max(cty), lower = quantile(cty, 0.25), upper = quantile(cty, 0.75), middle = mean(cty))
df %>%
ggplot(aes(class)) +
geom_boxplot(aes(ymin = ymin, ymax = ymax, lower = lower, upper = upper, middle = middle), stat = 'identity')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.