【问题标题】:`ggplot2`: label values of barplot that uses `fun.y="mean"` of `stat_summary``ggplot2`:使用`stat_summary`的`fun.y="mean"`的barplot的标签值
【发布时间】:2013-12-07 01:04:56
【问题描述】:

例如,如果我使用 ggplot2stat_summary() 绘制 3 档、4 档和 5 档汽车每加仑平均英里数的条形图,我如何标记每个条形图mpg 的平均值?

library(ggplot2)
CarPlot <- ggplot() +
  stat_summary(data= mtcars,
               aes(x = factor(gear),
                   y = mpg,
                   fill = factor(gear)
                   ),
               fun.y="mean",
               geom="bar"
               )
CarPlot

我知道您通常可以使用 geom_text(),但我无法弄清楚如何才能从 stat_summary() 获得平均值。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您应该使用内部变量..y.. 来获得计算的平均值。

    library(ggplot2)
    CarPlot <- ggplot(data= mtcars) +
                   aes(x = factor(gear),
                       y = mpg)+
          stat_summary(aes(fill = factor(gear)), fun.y=mean, geom="bar")+
          stat_summary(aes(label=round(..y..,2)), fun.y=mean, geom="text", size=6,
                 vjust = -0.5)
    CarPlot
    

    但可能最好事先汇总。

    【讨论】:

    • 为什么提前聚合更好?
    • @Adam 因为您可以更紧密地控制自己在做什么,并且拥有更大的灵活性。您也可以在另一个绘图、摘要、报告、...中使用相同的聚合...
    • 另外,在上面的调用中,摘要计算了两次,每次调用stat_summary 计算一次。对于小型数据集,这可能不是问题,但对于较大的数据集则可能。
    • 这个解决方案最终很好地解决了我的问题,所以我将继续接受它,但我很欣赏关于预聚合、agstudy 和@PaulHiemstra 的讨论。将来我会牢记这一点。也感谢您的解决方案,保罗。
    • 是否有可能产生相同的结果隐藏侧面的图例栏?谢谢
    【解决方案2】:

    我只需预先计算统计数据,然后再构建绘图:

    library(plyr)
    library(ggplot2)
    dat = ddply(mtcars, .(gear), summarise, mean_mpg = mean(mpg))
    dat = within(dat, {
        gear = factor(gear)
        mean_mpg_string = sprintf('%0.1f', mean_mpg)
      })
    ggplot(dat, aes(x = gear, y = mean_mpg)) + 
        geom_bar(aes(fill = gear), stat = "identity") + 
        geom_text(aes(label = mean_mpg_string), vjust = -0.5)
    

    【讨论】:

    • 你可以做的更简单,ggplot(ddply(mtcars, .(gear), summarise, mean_mpg = mean(mpg)), mean_mpg_string = sprintf('%0.1f', mean_mpg))+ geom_bar(..
    • 我不太喜欢在一个巨大的函数调用中将所有函数堆叠在一起。您最终不得不将函数拆分为多行以提高可读性,与使多个函数调用变小相比,一个函数调用的优势在于。此外,通过这种方式,摘要统计信息也可用于其他功能,例如制作一张桌子。
    • 我完全同意堆叠事实(ggplot+ddply),但是您仍然可以使用相同的 ddply 计算 mean_mpg 和 mean_mpg_string...ddply(mtcars, .(gear), summarise, mean_mpg = mean(mpg), mean_mpg_string = sprintf('%0.1f', mean_mpg))
    • @agstudy 这绝对是真的,我猜这一切都归结为品味问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 2017-06-10
    • 2015-10-16
    • 2013-06-08
    • 1970-01-01
    • 2018-08-31
    相关资源
    最近更新 更多