在ggplot2中标注箱线图

8
我使用ggplot2创建了一个并列箱线图。
p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg))
p + geom_boxplot(aes(fill=factor(cyl)))

我希望在图表中标注最小值、最大值、第一四分位数、中位数和第三四分位数。我知道geom_text()可以做到这一点,也许fivenum()有用。但我无法确定如何确切地实现!这些值应该显示在我的图表中。

3个回答

19

我能想到的最简洁的方法是使用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 构造)。

enter image description here


不错的回答。虽然这只是微不足道的差异,但我不确定ggplot是否使用相同的fivenum总结 - 因此可能会有差异。 - user20650
1
@user20650(是不是该给自己起一个更独特的SO名字了?)gpplot不会调用fun.y中给出的任何函数,那么它不只是从‘stats’中调用fivenum函数吗? - eipi10
1
现在我明白你的意思了。geom_boxplot使用分位数,但fivenum使用不同的算法。我已经更新了我的答案,使用分位数。 - eipi10
如何在箱线图上绘制上下四分位数的最大和最小值作为最大和最小值(而不是异常值)?例如,对于蓝色的最后一个箱线图,最小值和最大值是异常值。 - Andre230

6

一种方法是直接创建所需的数据框,并将其传递给geom_textgeom_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)

boxplot with labels


5

如果有人在处理大范围数据并需要对y轴进行log10转换,我找到了一些非常好用的代码。只需添加10^..y..scale_y_log10()即可。如果您没有在..y..之前添加10^,则实际分位数值将被log转换并以此显示。

不适用

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()

enter image description here


1
我应该在15分钟前向下滚动,我一直在努力弄清楚为什么我的值是错误的! - HikerT
很高兴能够帮助! - TheSciGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接