You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:09:18