如何使用R语言ggplot2绘制x轴为时间的100%堆叠面积图
R + ggplot2 绘制100%堆叠面积图实现方案
核心前置说明
绘制失败的核心原因是数据格式不符合ggplot2分组绘图要求:ggplot2绘制堆叠类图表必须使用长格式数据(每一行对应「x轴位置+单个分组+单个数值」的结构),逗号拼接的宽格式字符串无法直接被映射到绘图属性。
由于样例中每行example_col的数值求和已经为1,不需要额外做占比归一化计算,只需要完成字符串拆分、长宽转换即可直接绘图。
步骤1:加载依赖包
使用tidyverse生态的包完成数据处理和绘图,包含ggplot2、dplyr、tidyr等必要工具:
library(tidyverse) library(hms) # 用于处理时间格式数据
步骤2:数据格式转换
固定分组数写法(以样例中每组5个数值为例)
如果example_col每行固定拆分为N个分组,直接用separate拆分后转长格式即可:
# 假设你的原始数据框命名为raw_df plot_df <- raw_df %>% # 按逗号拆分example_col为5个独立列,自动转换为数值类型 separate(example_col, into = paste0("group", 1:5), sep = ",", convert = TRUE) %>% # 宽格式转长格式,满足ggplot2分组绘图要求 pivot_longer( cols = starts_with("group"), names_to = "category", values_to = "ratio" ) %>% # 把time字段转换为标准时间类型,避免x轴排序错乱 mutate(time = as_hms(time))
动态适配分组数写法
如果每行拆分的分组数不固定,用下面的写法自动适配,不需要手动指定分组数量:
plot_df <- raw_df %>% # 按逗号拆分字符串为行 separate_rows(example_col, sep = ",", convert = TRUE) %>% # 给每个时间点下的分组自动编号 group_by(time) %>% mutate( category = paste0("group", row_number()), ratio = example_col ) %>% ungroup() %>% # 转换时间格式,清理冗余列 mutate(time = as_hms(time)) %>% select(time, category, ratio)
步骤3:绘制100%堆叠面积图
直接调用geom_area,设置堆叠位置即可,因为数据本身每行和为1,输出就是标准100%堆叠效果:
ggplot(plot_df, aes(x = time, y = ratio, fill = category)) + # 堆叠面积层,设置透明度提升可读性 geom_area(position = "stack", alpha = 0.85) + # y轴格式化为百分比显示 scale_y_continuous(labels = scales::percent_format()) + # x轴按时间格式渲染标签 scale_x_time() + # 自定义图表标签 labs( x = "时间", y = "占比", fill = "分组类别" ) + # 简洁主题 theme_bw()
常见问题排查
- 如果绘图出现面积错位、断层,先检查
time字段是否已经转换为时间/数值类型,字符串格式的时间会按照字典序排序,导致x轴顺序错误。 - 如果分组填充颜色混乱,确认长格式数据中每个
time+category组合只有唯一一条观测值,重复值会导致图层叠加异常。
内容的提问来源于stack exchange,提问作者dev.niho
相关产品推荐
相关产品推荐

