如何使用R中ggplot2包绘制累积流量图(Cumulative Flow Diagram)
你之前代码输出异常的核心原因是geom_area()中指定了stat = "bin",该参数是用于对x轴变量的出现次数做分箱计数,不会对流量值做累积求和计算,也无法实现堆积折线对应的累积数值堆叠效果。
最佳实现方案
方案1:ggplot2原生实现(灵活性最高,可自定义所有样式)
步骤1:数据预处理
你需要先按实体分组、按年份排序后计算每个实体对应年份的累积流量值,示例代码使用dplyr完成预处理:
# 加载依赖包 library(ggplot2) library(dplyr) # 数据预处理:计算累积流量 processed_data <- 原始数据框名 %>% # 按实体、年份排序,保证累积计算顺序正确 arrange(Entity, Year) %>% # 按实体分组计算累积值 group_by(Entity) %>% # 将「流量数值列名」替换为你实际数据中存储流量值的列名 mutate(cumulative_flow = cumsum(流量数值列名)) %>% ungroup()
步骤2:绘制堆积面积CFD图
ggplot(processed_data, aes(x = Year, y = cumulative_flow, fill = Entity)) + # position = "stack" 实现各实体的累积值堆叠,对应Excel二维堆积折线效果 geom_area(position = "stack", alpha = 0.85) + scale_fill_brewer(palette = "Dark2") + # 可根据需求自定义坐标轴、标题等样式 labs(x = "年份", y = "累积流量", fill = "实体分类") + theme_bw()
如果你的原始数据中已经提前存储了每年各实体的累积值,不需要额外计算cumsum,可以直接将y映射为你已有的累积值列,去掉预处理步骤即可。
方案2:专用CFD包实现(代码最简,默认适配CFD业务规范)
可以直接用R生态中专门针对累积流量图开发的cfdr包实现,无需手动计算累积值:
# 安装包(首次使用执行) install.packages("cfdr") # 加载包 library(cfdr) # 直接绘图,替换对应列名即可 cfd_plot( df = 原始数据框名, date_col = "Year", state_col = "Entity", value_col = "流量数值列名", palette = "Dark2" )
内容的提问来源于stack exchange,提问作者Kamrul Hasan
相关产品推荐
相关产品推荐

