如何在ggplot分组条形图中添加总数值统计条?
解决思路:添加总计分组条形到现有图表
1. 构造包含总计的数据
首先需要把所有城市的Cases按Type汇总,生成“总计”数据行,再合并到原数据框里。这里提供两种实现方式:
方式一:用dplyr简化操作
library(dplyr) library(ggplot2) # 原数据 df <- data.frame("City"=c("Vienna","Vienna","London","London","Berlin", "London", "Berlin","Berlin","Vienna","Vienna","Vienna", "Vienna", "Berlin","Vienna","Vienna","Vienna"),"Type"=c("repeat","once","repeat","once","repeat","once", "repeat","once","repeat","once","repeat","repeat","repeat","repeat","repeat","once"),"Cases"=c(10,20,30,40,50,60,70,80,90,10,20,30,40,50,60,40)) # 按Type汇总Cases,生成总计行 total_df <- df %>% group_by(Type) %>% summarize(City = "Total", Cases = sum(Cases)) %>% ungroup() # 合并原数据和总计数据 df_with_total <- bind_rows(df, total_df)
方式二:基础R实现
# 原数据 df <- data.frame("City"=c("Vienna","Vienna","London","London","Berlin", "London", "Berlin","Berlin","Vienna","Vienna","Vienna", "Vienna", "Berlin","Vienna","Vienna","Vienna"),"Type"=c("repeat","once","repeat","once","repeat","once", "repeat","once","repeat","once","repeat","repeat","repeat","repeat","repeat","once"),"Cases"=c(10,20,30,40,50,60,70,80,90,10,20,30,40,50,60,40)) # 计算各Type的总Cases repeat_total <- sum(df$Cases[df$Type == "repeat"]) once_total <- sum(df$Cases[df$Type == "once"]) # 构造总计数据框 total_df <- data.frame(City = c("Total", "Total"), Type = c("repeat", "once"), Cases = c(repeat_total, once_total)) # 合并数据 df_with_total <- rbind(df, total_df)
2. 绘制包含总计的分组条形图
用合并后的数据框绘图,x轴会自动包含Total类别,和其他城市的条形并列。如果想突出总计条,可以给它加个黑色边框:
ggplot(df_with_total, aes(fill=Type, x=City, y=Cases)) + geom_bar(position="dodge", stat="identity") + # 给总计条添加黑色边框,方便区分 geom_bar(data = total_df, aes(fill=Type, x=City, y=Cases), position="dodge", stat="identity", color="black", size=1)
这样生成的图表里,Total分组条的每个颜色块高度,对应所有城市该Type的Cases总和,和原图表的填充逻辑完全一致。
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

