修改顶部ggplot百分比条形图上的文本标签
Posted
技术标签:
【中文标题】修改顶部ggplot百分比条形图上的文本标签【英文标题】:Modifying text labels on top ggplot percentage barplot 【发布时间】:2021-10-01 19:32:04 【问题描述】:我正在尝试生成一个分组条形图,其中 y 轴上的百分比计数和代表其值的每个条形顶部的文本
我的代码如下:
geom_bar(aes(y = (..count..)/sum(..count..) * 100), width = 0.7) +
labs(x = "Hours Worked 48 or more", y = "% of Employees", fill = "Hours Worked 48 or more", title = "Post-Legislation") +
theme_minimal() +
scale_fill_manual(values = c("orange", "blue")) +
geom_text(aes(label = (..count..)/sum(..count..) * 100, y = ..prop..), stat= "count", vjust = -.5) +
theme(legend.position = "top")
我希望文本为白色,精确到 1dp,并放置在每个条形的顶部。
我一直在尝试不同的代码,但无法得到想要的结果。
任何帮助将不胜感激。
这里是数据sn-p:
structure(list(year = c("2018", "2018", "2018", "2018", "2018",
"2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018",
"2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018",
"2018", "2018", "2018", "2018", "2018", "2018", "2018", "2018",
"2018"), hours.48 = c("Yes", "No", "No", "No", "Yes", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "Yes", "No", "No",
"No", "No", "No", "No", "No", "No", "No", "No", "No", "No", "No",
"No", "No")), row.names = c(NA, 30L), class = "data.frame")
【问题讨论】:
如果您也可以添加数据 sn-p 以使其完全可重现,那就太好了。见dput
。
@coffeinjunky 我现在已经这样做了。
在下面查看我建议的尝试。
【参考方案1】:
试试这个:
library(tidyverse)
library(ggplot2)
positions = df %>% group_by(hours.48) %>% summarise(prop=n()/nrow(df)*100)
注意,我在这里预先计算标签 = 位置。鉴于您的示例数据,没有任何小数,但如果您想沿着这条路线走,您可以在此处格式化您希望看到的值。就个人而言,我更喜欢预先计算我想要绘制的所有内容以分离职责。
ggplot(df, aes(x=hours.48, fill=hours.48)) +
geom_bar(aes(y = (..count..)/sum(..count..) * 100), width = 0.7) +
labs(x = "Hours Worked 48 or more", y = "% of Employees", fill = "Hours Worked 48 or more", title = "Post-Legislation") +
theme_minimal() +
scale_fill_manual(values = c("orange", "blue")) +
geom_text(data=positions, aes(label = prop, y = prop), colour='white', stat= "identity", vjust = 1) +
theme(legend.position = "top")
您还可以通过使用以下两行而不是上面的相应行将positions
查询为数据框而不是原始的df
来进一步简化此操作:
ggplot(positions, aes(x=hours.48, fill=hours.48)) +
geom_bar(aes(y = prop), width = 0.7, stat='identity') +
【讨论】:
如果要添加 % 而不是整数? @user3571389:请用 % 查看我的回答。 只需使用label = paste0(prop, "%")
而不是label=prop
。 @user3571389
在对geom_text
的调用中,即。【参考方案2】:
使用您的原始数据集和 scales
包,您可以这样做:
library(ggplot2)
library(scales)
ggplot(df, aes(x = as.factor(hours.48), fill=as.factor(hours.48))) +
geom_bar(aes(y = (..count..)/sum(..count..))) +
geom_text(aes(y = ((..count..)/sum(..count..)),
label = scales::percent((..count..)/sum(..count..))),
stat = "count", vjust = 2, color="white") +
labs(x = "Hours Worked 48 or more", y = "% of Employees", fill = "Hours Worked 48 or more", title = "Post-Legislation") +
theme_minimal() +
scale_fill_manual(values = c("orange", "blue")) +
theme(legend.position = "top")
【讨论】:
以上是关于修改顶部ggplot百分比条形图上的文本标签的主要内容,如果未能解决你的问题,请参考以下文章
R语言ggplot2可视化:使用dplyr包计算每个分组个数的比例(对计算获得的百分比进行近似,值保留整数部分)使用ggplot2可视化条形图(bar plot)并在条形图上添加百分比标签
R语言ggplot2可视化在分面图(facet_grid)的条形图上添加计数(count)或者百分比(percent)标签实战