【问题标题】:annotate boxplot in ggplot2在ggplot2中注释箱线图
【发布时间】:2016-10-27 12:12:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: r ggplot2 boxplot geom-text


    【解决方案1】:

    如果有人处理大范围并且必须对他们的 y 轴进行 log10 变换,我发现一些代码效果很好。只需添加10^..y..scale_y_log10()。如果您不在..y.. 之前添加10^,则实际的分位数值将被对数转换并显示为这样。

    不起作用

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

    【讨论】:

    • 我应该在 15 分钟前向下滚动,我一直在用头撞墙,试图弄清楚为什么我的价值观是错误的!
    • 很高兴能帮上忙!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不错的答案。虽然差异很小,但我不确定 ggplot 使用相同的 Fivenum 摘要 - 所以可能存在差异。
      • @user20650 (是不是该给自己取一个更独特的 SO 名称了?) gpplot 不会调用fun.y 中给出的任何函数,所以它不会只调用@来自stats的987654330@函数?
      • 作为,现在我明白你的意思了。 geom_boxplot 使用分位数,但 Fivenum 使用不同的算法。我已更新我的答案以使用分位数。
      猜你喜欢
      • 2021-10-28
      • 2018-02-14
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      相关资源
      最近更新 更多