【问题标题】:Adding percentage labels to a bar chart in ggplot2将百分比标签添加到 ggplot2 中的条形图
【发布时间】:2021-07-17 03:09:45
【问题描述】:

如何使用geom_textggplot2 的每个条形顶部添加百分比标签?我知道有几个类似的问题已经得到解答。但他们要么只使用 1 个分类变量,要么在绘图前计算百分比。
我有以下情节:

ggplot(data = mtcars)+
  geom_bar(aes(x = factor(cyl), 
               y = (..count..)/sum(..count..)*100,
               fill = factor(gear)),
           position = "dodge")  

现在我想在顶部添加百分比标签。如果我在geom_text 中使用y = (..count..)/sum(..count..)*100,它会显示Error in eval(expr, envir, enclos) : object 'count' not found

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    在 ggplot 之外预先计算您需要的数量是最简单的,因为很难跟踪 ggplot 计算的内容以及这些数量的存储和可用位置。

    首先,总结一下你的数据:

    library(dplyr)
    library(ggplot2)
    
    mtcars %>% 
        count(cyl = factor(cyl), gear = factor(gear)) %>% 
        mutate(pct = prop.table(n))
    #> # A tibble: 8 x 4
    #>   cyl   gear      n    pct
    #>   <fct> <fct> <int>  <dbl>
    #> 1 4     3         1 0.0312
    #> 2 4     4         8 0.25  
    #> 3 4     5         2 0.0625
    #> 4 6     3         2 0.0625
    #> 5 6     4         4 0.125 
    #> 6 6     5         1 0.0312
    #> 7 8     3        12 0.375 
    #> 8 8     5         2 0.0625
    

    如果你愿意,可以保存,或者直接输入 ggplot:

    mtcars %>% 
        count(cyl = factor(cyl), gear = factor(gear)) %>% 
        mutate(pct = prop.table(n)) %>% 
        ggplot(aes(x = cyl, y = pct, fill = gear, label = scales::percent(pct))) + 
        geom_col(position = 'dodge') + 
        geom_text(position = position_dodge(width = .9),    # move to center of bars
                  vjust = -0.5,    # nudge above top of bar
                  size = 3) + 
        scale_y_continuous(labels = scales::percent)
    

    如果你真的想把它全部保留在 ggplot 内部,你可以使用 geom_textstat = 'count'(或者 stat_countgeom = "text",如果你愿意的话):

    ggplot(data = mtcars, aes(x = factor(cyl), 
                              y = prop.table(stat(count)), 
                              fill = factor(gear), 
                              label = scales::percent(prop.table(stat(count))))) +
        geom_bar(position = "dodge") + 
        geom_text(stat = 'count',
                  position = position_dodge(.9), 
                  vjust = -0.5, 
                  size = 3) + 
        scale_y_continuous(labels = scales::percent) + 
        labs(x = 'cyl', y = 'pct', fill = 'gear')
    

    绘制完全相同的东西。

    【讨论】:

      猜你喜欢
      • 2018-06-04
      • 1970-01-01
      • 2020-10-12
      • 2016-06-16
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      相关资源
      最近更新 更多