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

如何用R语言ggplot绘制含曲线的指定堆叠面积图?

问题描述

我有一份.txt格式的时序数据,包含Year、Frequency_FQR1、Frequency_FQR2、Frequency_Others、Frequency_PnimB字段,部分数据如下:

Year    Frequency_FQR1  Frequency_FQR2  Frequency_Others    Frequency_PnimB
1989    0   0   0   0
1990    0   0   0   0
1991    0   0   0   0
1992    0   0   0   0
1993    0   0   0   0
1994    0   0   0.166666667 0.166666667
1995    0   0   0   0
1996    0   0   0   0
1997    0   0   0.083333333 0.083333333
1998    0   0   0   0
1999    0   0   0   0
2000    0   0   0   0
2001    0.041666667 0.041666667 0.166666667 0.25
2002    0   0.045454545 0.045454545 0.090909091
2003    0   0.086956522 0.130434783 0.217391304
2004    0   0.108695652 0.304347826 0.413043478
2005    0.101694915 0.084745763 0.169491525 0.355932203
2006    0.00754717  0.433962264 0.064150943 0.505660377
2007    0.017679558 0.409944751 0.097237569 0.524861878
2008    0.011350738 0.282633371 0.077185017 0.371169126
2009    0.005780347 0.225433526 0.046242775 0.277456647
2010    0.020966272 0.1349134   0.053783045 0.209662716

数据后续还有更多内容。我尝试用ggplot绘制图形,代码如下:

data <- read.delim ("test.txt")

ggplot(data, aes(x=Year)) +
geom_area(aes(y=Frequency_FQR1, x=Year)) +
geom_area(aes(y=Frequency_FQR2, x=Year)) +
geom_area(aes(y=Frequency_Others, x=Year)) +
geom_area(aes(y=Frequency_PnimB, x=Year)) +
scale_x_continuous(limits = c(1989, 2022))+
theme_classic()

但未得到预期图形,且不确定y参数的正确设置。我希望将Frequency_FQR1、Frequency_Others、Frequency_FQR2绘制成堆叠面积图,同时添加Frequency_PnimB的曲线,寻求解决方案。

解决方案

你的问题核心是宽格式数据无法直接生成堆叠面积图,ggplot的geom_area默认堆叠需要数据为长格式(一个列存类别,一个列存对应数值)。另外Frequency_PnimB需作为单独曲线,而非堆叠部分,具体步骤如下:

1. 转换数据格式(宽转长)

使用tidyr和dplyr包将需要堆叠的三个字段转换为长格式,保留Year和Frequency_PnimB作为标识列:

library(ggplot2)
library(tidyr)
library(dplyr)

# 读取数据
data <- read.delim("test.txt")

# 仅转换需要堆叠的三个字段为长格式
data_long <- data %>%
  pivot_longer(cols = c(Frequency_FQR1, Frequency_FQR2, Frequency_Others),
               names_to = "Category",
               values_to = "Frequency")

2. 绘制堆叠面积图+曲线

用转换后的长格式数据绘制堆叠面积,再用原始宽格式数据添加Frequency_PnimB曲线:

ggplot() +
  # 堆叠面积图:自动按Category分组堆叠
  geom_area(data = data_long, 
            aes(x = Year, y = Frequency, fill = Category),
            alpha = 0.7) +
  # 添加Frequency_PnimB曲线
  geom_line(data = data,
            aes(x = Year, y = Frequency_PnimB),
            color = "black", size = 1) +
  # 设置x轴范围
  scale_x_continuous(limits = c(1989, 2022)) +
  # 调整主题与标签
  theme_classic() +
  labs(x = "年份", y = "频率", fill = "类别") +
  scale_fill_brewer(palette = "Set2") # 可选:设置配色方案

关键说明

  • 原代码多次调用geom_area只会导致图层重叠,无法形成堆叠,因为每个图层没有共享分组信息。
  • 长格式数据让ggplot自动识别Category作为堆叠分组,完成堆叠计算。
  • geom_line直接使用原始宽格式数据,因为仅需单条曲线,无需分组。

内容的提问来源于stack exchange,提问作者user14714429

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:32:20