如何在百分比条形图上方添加百分比或计数标签?

Posted

技术标签:

【中文标题】如何在百分比条形图上方添加百分比或计数标签?【英文标题】:How to add percentage or count labels above percentage bar plot? 【发布时间】:2021-09-12 07:30:01 【问题描述】:

使用ggplot2 1.0.0,我按照以下帖子中的说明了解如何绘制跨因子的百分比条形图:

Sum percentages for each facet - respect "fill"

test <- data.frame(
     test1 = sample(letters[1:2], 100, replace = TRUE), 
     test2 = sample(letters[3:8], 100, replace = TRUE)
     )
library(ggplot2)
library(scales)
ggplot(test, aes(x= test2, group = test1)) + 
geom_bar(aes(y = ..density.., fill = factor(..x..))) + 
facet_grid(~test1) +
scale_y_continuous(labels=percent)

但是,当使用 geom_text 时,我似乎无法获得每个条形图上方的总计数或百分比的标签。

对上述代码的正确补充是什么同时保留了 y 轴百分比?

【问题讨论】:

【参考方案1】:

留在ggplot,你可以试试

ggplot(test, aes(x= test2,  group=test1)) + 
  geom_bar(aes(y = ..density.., fill = factor(..x..))) +
  geom_text(aes( label = format(100*..density.., digits=2, drop0trailing=TRUE),
                 y= ..density.. ), stat= "bin", vjust = -.5) +
  facet_grid(~test1) +
  scale_y_continuous(labels=percent)

对于计数,在 geom_bar 和 geom_text 中将 ..density.. 更改为 ..count..

ggplot 2.x 更新

ggplot2 2.0ggplot 进行了许多更改,包括更改了geom_bar ggplot 2.0.0 使用的默认stat 函数时破坏了此代码的原始版本。它不再像以前那样调用stat_bin 来对数据进行分箱,而是现在调用stat_count 来计算每个位置的观察值。 stat_count 返回 prop 作为该位置的计数比例,而不是 density

下面的代码已经过修改以适用于这个新版本的ggplot2。我已经包含了两个版本,它们都将条形的高度显示为计数的百分比。第一个以百分比形式显示条形上方的计数比例,而第二个显示条形上方的计数。我还为 y 轴和图例添加了标签。

  library(ggplot2)
  library(scales)
#
# Displays bar heights as percents with percentages above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes( label = scales::percent(..prop..),
                   y= ..prop.. ), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)
#
# Displays bar heights as percents with counts above bars
#
    ggplot(test, aes(x= test2,  group=test1)) + 
    geom_bar(aes(y = ..prop.., fill = factor(..x..)), stat="count") +
    geom_text(aes(label = ..count.., y= ..prop..), stat= "count", vjust = -.5) +
    labs(y = "Percent", fill="test2") +
    facet_grid(~test1) +
    scale_y_continuous(labels=percent)

第一个版本的情节如下所示。

【讨论】:

一个很好的解决方案(+1)!试图获得相同但总是忘记包含该死的stat= "bin" :-) 玩得很好。这很好,紧凑且包含。 是的。在 geom_text 中,y= ..density.. 确定标签的放置位置。您可以将任何文本字符串分配给标签。对于计数,只需将标签更改为 label = ..count.. @WaltS 是否可以让 Y 轴保持密度并且每个条形顶部的标签都可以计数,而整个轴不会向计数刻度移动? @WaltS,我试图用position = "dodge" 在 Shiny 中生成类似的情节,但是所有条形都达到了 100%。如果你能建议我哪里出错了,那就太好了。谢谢我已将问题发布在***.com/questions/41078480/…【参考方案2】:

如果您预先汇总数据,这将更容易做到。例如:

library(ggplot2)
library(scales)
library(dplyr)

set.seed(25)
test <- data.frame(
  test1 = sample(letters[1:2], 100, replace = TRUE), 
  test2 = sample(letters[3:8], 100, replace = TRUE)
)

# Summarize to get counts and percentages
test.pct = test %>% group_by(test1, test2) %>%
  summarise(count=n()) %>%
  mutate(pct=count/sum(count)) 

ggplot(test.pct, aes(x=test2, y=pct, colour=test2, fill=test2)) +
  geom_bar(stat="identity") +
  facet_grid(. ~ test1) +
  scale_y_continuous(labels=percent, limits=c(0,0.27)) + 
  geom_text(data=test.pct, aes(label=paste0(round(pct*100,1),"%"),
                               y=pct+0.012), size=4)

(仅供参考,您也可以将标签放在栏内,例如,将最后一行代码更改为:y=pct*0.5), size=4, colour="white")

【讨论】:

【参考方案3】:

我已经使用了你所有的代码并想出了这个。首先将您的 ggplot 分配给一个变量,即 p


    dat <- ggplot_build(p)$data %>% ldply() %>% select(group,density) %>% 
       do(data.frame(xval = rep(1:6, times = 2),test1 = mapvalues(.$group, from = c(1,2), to = c("a","b")), density = .$density))

    p + geom_text(data=dat, aes(x = xval, y = (density + .02), label = percent(density)), colour="black", size = 3)

【讨论】:

我尝试在我的解决方案中使用 label = percent(..count..) 但收到一条错误消息,指出它找不到函数百分比。它确实在 facet_grid 中找到百分比并找到格式。关于为什么找不到百分比的任何想法? 好吧,我不确定。假设您明显加载了 scales 包。对我来说,这听起来像是一个名称空间屏蔽问题。你上面写的在我看来应该有效。 您是如何将因子标签从 1:6 更改为 c:h 的?

以上是关于如何在百分比条形图上方添加百分比或计数标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何在分组条形图上方显示百分比

R语言ggplot2可视化:ggplot2可视化水平堆叠条形图并且在每个堆叠条形图的内部居中添加百分比文本标签信息

将百分比标签添加到堆积条形图ggplot2

修改顶部ggplot百分比条形图上的文本标签

如何向条形图添加多个注释

R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签