将百分比标签添加到 ggplot2 中的条形图 [英] Adding percentage labels to a bar chart in ggplot2

查看:54
本文介绍了将百分比标签添加到 ggplot2 中的条形图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I use geom_text to add percentage labels on top of each bar in ggplot2? I know there are several similar questions which are already answered. But they either use only 1 categorical variable or compute the percentages before plotting.
I have following plot:

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, 环境, enclos) : 未找到对象计数".

Now I want to add the percentage labels on the top. If I use y = (..count..)/sum(..count..)*100 in geom_text, it says Error in eval(expr, envir, enclos) : object 'count' not found.

推荐答案

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

It's easiest to calculate the quantities you need beforehand, outside of ggplot, as it's hard to track what ggplot calculates and where those quantities are stored and available.

首先,总结您的数据:

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:

Save that if you like, or pipe directly into 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",如果您愿意):

If you really want to keep it all internal to ggplot, you can use geom_text with stat = 'count' (or stat_count with geom = "text", if you prefer):

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

绘制完全相同的东西.

这篇关于将百分比标签添加到 ggplot2 中的条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆