如何使用分组的计数条形图调整标签

Posted

技术标签:

【中文标题】如何使用分组的计数条形图调整标签【英文标题】:How to vjust a label with a grouped bar chart of counts 【发布时间】:2021-02-20 17:45:51 【问题描述】:

我有一个计数数据的分组条形图,并希望将标签放置在每个条形的中点。但是,我不知道如何将 vjust 语句添加到标签的位置 - 它不断与 geom_text 和 stat_count 出错。任何帮助都会很棒!

data <- data.frame(month = c(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 
                   3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
                   4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 
                   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
                   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
                   5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
                   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
                   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
                   6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 
                   6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
                   7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 
                   7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 
                   8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 
                   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
                   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 
                   9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 
                   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
                   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
                   10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 
                   11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 
                   11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11),
                   year = c(2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2019, 2019, 2019, 2019, 2019, 2019, 
                            2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 2020, 
                            2020, 2020, 2020, 2020))

ggplot(data, aes(x=factor(month), fill=factor(year))) +
  geom_bar(stat="count", position = position_dodge2(preserve = "single"), colour="black") +
  stat_count(geom = "text", colour = "black", size = 4,
             aes(label = ..count..), position=position_dodge(width=0.9))

【问题讨论】:

【参考方案1】:

这可以通过将..count.. / 2 映射到y 来实现:

library(ggplot2)

ggplot(data, aes(x=factor(month), fill=factor(year))) +
  geom_bar(stat="count", position = position_dodge2(preserve = "single"), colour="black") +
  stat_count(geom = "text", colour = "black", size = 4,
             aes(label = ..count.., y = ..count.. / 2), position=position_dodge(width=0.9))

【讨论】:

以上是关于如何使用分组的计数条形图调整标签的主要内容,如果未能解决你的问题,请参考以下文章

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

Plotly:如何使用 go.Bar 向堆积条形图添加数据标签?

Python使用seaborn可视化分组条形图并且在分组条形图的条形上添加数值标签(seaborn grouped bar plot add labels)

ggplot - 如何堆叠和分组条形图?

Python使用seaborn可视化分组条形图(side by side)并且在分组条形图的条形上添加数值标签(seaborn grouped bar plot add labels)

如何将文本标记添加到 Vega Lite 分组条形图