我使用 ggplot2 创建了一个并排的箱线图。
p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg))
p + geom_boxplot(aes(fill=factor(cyl)))
我想在图中用最小值、最大值、第一四分位数、中位数和第三四分位数进行注释。我知道geom_text()
可以这样做并且可能fivenum()
有用。但我无法弄清楚我到底能做什么!这些值应该显示在我的情节中。
我能想到的最简洁的方法是使用stat_summary
. 我还将标签映射到颜色美学,但如果您愿意,当然可以将标签设置为单一颜色:
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()
在上面的代码中,我们使用quantile
摘要函数来获取标签值。..y..
指回quantile
函数的输出(通常,..*..
是一个 ggplot 构造,用于使用在 ggplot 中计算的值)。
一种方法是简单地制作您需要的 data.frame,并将其传递给geom_text
or geom_label
:
library(dplyr)
cyl_fivenum <- mtcars %>%
group_by(cyl) %>%
summarise(five = list(fivenum(mpg))) %>%
tidyr::unnest()
ggplot(mtcars, aes(x=factor(cyl), y=mpg)) +
geom_boxplot(aes(fill=factor(cyl))) +
geom_text(data = cyl_fivenum,
aes(x = factor(cyl), y = five, label = five),
nudge_x = .5)
如果有人在处理大范围并且必须对他们的 y 轴进行 log10 转换,我发现一些代码效果很好。只需添加10^..y..
和scale_y_log10()
。如果您在实际分位数值将被对数转换并显示为10^
之前不添加。..y..
不工作
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.45), size=3.5) +
scale_y_log10()+
theme_bw()
效果很好
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", 10^..y..), color=factor(cyl)),
position=position_nudge(x=0.45), size=3.5) +
scale_y_log10()+
theme_bw()