使用facet_wrap()结合geom_text()标注点时标签错误,需标注百分比咨询
解决ggplot2结合facet_wrap与geom_text标注百分比的问题
我来帮你搞定这个标注百分比的问题,先拆解你代码里的核心问题,再一步步修正:
1. 先解决重复分面的冲突
你的代码里同时用了facet_grid(.~Delivery.time)和facet_wrap(~Delivery.time, ncol = 1),这两个分面函数不能同时使用,会导致绘图逻辑冲突。根据你用facet_wrap的需求,直接删掉facet_grid那一行就好。
2. 生成百分比标签
要标注百分比,首先得把你的freq转换成百分比数值,再格式化成带%的文本。这里可以用scales包的percent()函数来简化格式化操作,当然也可以手动拼接字符串。
假设你的freq是每个分组的计数,先计算每个Delivery.time分组内的百分比(如果是全局百分比就去掉分组):
# 先计算百分比列 library(dplyr) counter2 <- counter2 %>% group_by(Delivery.time) %>% mutate(percent = freq / sum(freq)) %>% ungroup()
3. 修正geom_text的标签映射
把geom_text的label改成格式化后的百分比,同时调整位置避免和点重叠:
完整修正后的代码
library(ggplot2) library(scales) library(dplyr) # 先处理百分比计算 counter2 <- counter2 %>% group_by(Delivery.time) %>% mutate(percent = freq / sum(freq)) %>% # 按Delivery.time分组计算百分比 ungroup() plot2 <- ggplot(counter2, aes(x = as.character(week), y = freq, group = Delivery.time)) + geom_point(colour = "red") + geom_line(colour = "red") + labs(x = "Month", y = "Number Of Customers") + # 删掉重复的facet_grid,保留facet_wrap facet_wrap(~Delivery.time, ncol = 1) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # 用scales::percent()格式化百分比标签,调整位置 geom_text(aes(label = percent(percent)), size = 2.5, hjust = 0.5, vjust = -0.5) plot2
额外小提示
- 如果你的
freq已经是比例值,直接用percent(freq)就行,不用再计算占比 - 如果担心标签和点重叠,可以调整
vjust或者hjust的数值,比如改成vjust = 1.5把标签放在点下方 - 要是想保留原数值+百分比的组合标签,可以写成
label = paste(freq, "(", percent(percent), ")", sep = "")
内容的提问来源于stack exchange,提问作者Sameh Mostafa
相关产品推荐
相关产品推荐

