我想在 ggplot 的箱线图中标记晶须的末端,而不是最小值和最大值,在我的数据中它们通常是异常值。
我尝试使用此处找到的代码:annotate boxplot in ggplot2,但是正如您从factor(cyl)=8(蓝色)的输出中看到的那样,绝对最小值和最大值被标记,而不是点胡须结束的地方。
ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) +
geom_boxplot(width=0.6) +
stat_summary(geom="text", fun.y=quantile,
aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
position=position_nudge(x=0.33), size=3.5) +
theme_bw()
在给出的示例中,我希望标记因子(cyl)上的晶须,而不是异常值。
感谢大家提供的任何帮助。
箱线图使用
boxplots.stats
。您可以直接在您的stat_summary
中使用它:
ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) +
geom_boxplot(width=0.6) +
stat_summary(
aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
geom="text",
fun.y = function(y) boxplot.stats(y)$stats,
position=position_nudge(x=0.33),
size=3.5) +
theme_bw()
如果您只需要胡须,只需使用
boxplot.stats(y)$stats[c(1, 5)]
即可。
欢迎
有点管用,我不明白为什么 8 个气缸会坏
library(tidyverse)
outlier_range <- function(x) {
first_quantile <- quantile(x,0.25)
third_quantile <- quantile(x,0.75)
iqr <- IQR(x)
outlier_lower <- max(min(x), first_quantile - 1.5 * iqr)
outlier_higher <- min(max(x), third_quantile + 1.5 * iqr)
return(c(outlier_lower, outlier_higher))
}
ggplot(mtcars) +
aes(x=factor(cyl), y=mpg, fill=factor(cyl)) +
geom_boxplot(width=0.6) +
theme_bw() +
stat_summary(geom="text", fun.y=outlier_range,
aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
position=position_nudge(x=0.33), size=3.5)
搭载@Axeman:
ggplot(mtcars, aes(x=factor(cyl), y=mpg, fill=factor(cyl))) +
geom_boxplot(width=0.6) +
stat_summary(
aes(label=sprintf("%1.1f", ..y..), color=factor(cyl)),
geom="text",
fun.y = function(y) boxplot.stats(y)$stats[c(1,5)],
position=position_nudge(x=0.33),
size=3.5) +
theme_bw()
为了完整起见,这里介绍如何使用ggplot的延迟评估:
改编示例来自文档:
library(dplyr)
library(ggplot2)
mtcars |>
mutate(cyl = as.factor(cyl)) |>
ggplot()+
geom_boxplot(aes(x = cyl, y = mpg)) +
geom_text(aes(x = stage(cyl, after_stat = x),
y = stage(mpg, after_stat = middle),
label = after_stat(middle)
), nudge_y = 2,
stat = 'boxplot'
)
上面的示例标记了中位数。 有关其他可用统计信息,请参阅
?stat_boxplot
的“计算变量”部分。