8

我使用 ggplot2 创建了一个并排的箱线图。

p <- ggplot(mtcars, aes(x=factor(cyl), y=mpg))
p + geom_boxplot(aes(fill=factor(cyl)))

我想在图中用最小值、最大值、第一四分位数、中位数和第三四分位数进行注释。我知道geom_text()可以这样做并且可能fivenum()有用。但我无法弄清楚我到底能做什么!这些值应该显示在我的情节中。

4

3 回答 3

17

我能想到的最简洁的方法是使用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 中计算的值)。

在此处输入图像描述

于 2016-06-25T19:39:17.450 回答
5

一种方法是简单地制作您需要的 data.frame,并将其传递给geom_textor 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)

带标签的箱线图

于 2016-06-24T19:53:32.253 回答
4

如果有人在处理大范围并且必须对他们的 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()

在此处输入图像描述

于 2019-04-19T13:28:02.133 回答