如何用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
相关产品推荐
相关产品推荐

