问题描述
如何使用 geom_text
在 ggplot2
中的每个条形顶部添加百分比标签?我知道有几个类似的问题已经得到了回答.但他们要么只使用 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_text
与 stat = 'count'
(或 stat_count
与geom = "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 中的条形图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!