在柱状图上添加百分比标签

26
如何使用geom_textggplot2中为每个柱状图添加百分比标签?我知道已经有几个类似的问题得到了解答。但是它们要么只使用一个分类变量,要么在绘图之前计算百分比。
我有以下的图表:
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。
1个回答

55

在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')

它绘制的内容完全相同。


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