如何用极简代码实现R数据聚合计算并生成ggplot分组柱状图
解决方案
使用tidyverse套件可以用极精简的代码完成需求,首先加载依赖包:
library(tidyverse)
完整实现代码
1. 生成要求的汇总表
sum_df <- as.data.frame(d) %>% pivot_longer(b:c, names_to = "col", values_to = "count") %>% count(a, col, wt = count, name = "count")
生成的sum_df结构完全匹配要求:
# A tibble: 4 × 3 a col count <dbl> <chr> <dbl> 1 2010 b 110 2 2010 c 100 3 2015 b 270 4 2015 c 80
2. 绘制并列柱状图
ggplot(sum_df, aes(x = factor(a), y = count, fill = col)) + geom_col(position = "dodge", width = 0.8) + labs(x = "年份", y = "count", fill = "字段")
如果不需要单独存储汇总表,可以用链式操作一步出图,代码更短:
as.data.frame(d) %>% pivot_longer(b:c, names_to = "col", values_to = "count") %>% count(a, col, wt = count, name = "count") %>% ggplot(aes(factor(a), count, fill = col)) + geom_col(position = "dodge")
关键逻辑说明
- 原数据
d是cbind生成的矩阵,先转成数据框适配tidyverse函数逻辑 pivot_longer一步完成宽表转长表,直接生成要求的col、count字段- 用
count()替代group_by()+summarise()完成分组求和,代码更精简,参数wt指定求和的数值列 - 绘图时将a转为因子避免x轴出现2010-2015之间无数据的年份,
position = "dodge"实现同一年份两个柱子并列展示
内容的提问来源于stack exchange,提问作者shokoufa zeynali
相关产品推荐
相关产品推荐

