ggplot2无需pivot_longer转换直接生成堆叠柱状图的方法问询
可以不用对原宽表执行pivot_longer转换直接生成堆叠柱状图,最适配你需求的实现方案如下:
方案1:多geom_bar独立映射(完全保留原宽表结构)
直接为每个需要堆叠的字段单独声明geom_bar图层,手动指定映射关系即可,原表所有衍生字段完全保留,后续叠加其他图层无需额外处理:
# 宽表直接生成堆叠柱状图 ggplot(egdf, aes(x = ch)) + # 底层堆叠字段:N geom_bar(aes(y = N, fill = "N"), stat = "identity") + # 上层堆叠字段:M,默认自动堆叠到底层柱子上方 geom_bar(aes(y = M, fill = "M"), stat = "identity") + # 自定义图例名称 labs(fill = "指标")
你需要叠加衍生字段的标注时,直接新增对应图层即可,示例如下:
# 完整示例:堆叠图+衍生字段标注 ggplot(egdf, aes(x = ch)) + geom_bar(aes(y = N, fill = "N"), stat = "identity") + geom_bar(aes(y = M, fill = "M"), stat = "identity") + # 叠加转化率标注到柱子顶部 geom_text(aes(y = N + M, label = Rate), vjust = -0.3) + # 叠加降幅标注到N字段柱子的中部 geom_text(aes(y = N/2, label = drop_pct), color = "white") + labs(fill = "指标", y = "数值")
方案2:转长表时保留衍生字段(适合堆叠字段较多的场景)
如果你后续需要堆叠的字段超过2个,写多组geom_bar效率较低,可以在pivot_longer时将不需要转换的衍生字段设为id_cols,不会破坏字段关联关系:
egdf %>% # 仅转换N、M为长表,其他字段全部保留 pivot_longer(cols = c(N, M), names_to = 'metric', id_cols = c(ch, drop, drop_pct, Rate)) %>% ggplot(aes(x = ch, y = value, fill = metric)) + geom_bar(stat = "identity") + # 可直接调用保留的衍生字段做标注 geom_text(aes(label = Rate), position = position_stack(vjust = 0.5))
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

