R语言堆叠面积图叠加geom_line报错:如何添加不同数据集的折线?
问题解决方法
一、解决'metric未找到'的报错
报错根源是全局美学映射继承问题:你在ggplot()的全局aes()里定义了fill=metric,但给geom_line用的原始数据集df里没有metric列,ggplot会自动继承全局的所有映射,所以找不到这个列报错。
有两种简单的解决方式:
方式1:将fill映射移到geom_area的局部
把只属于堆叠面积图的fill=metric放到geom_area的aes()里,全局只保留通用的x和y映射,这样geom_line就不会继承不需要的fill要求:
ggplot(df_long, aes(x=time, y=value)) + geom_area(aes(fill=metric), alpha=0.6, linewidth=0.5, colour="white") + scale_fill_viridis(discrete = T) + geom_line(data = df, aes(x=time, y=E))
方式2:给geom_line禁用继承
在geom_line里加上inherit.aes=FALSE,强制不继承全局的美学映射,同时手动指定需要的x和y:
ggplot(df_long, aes(x=time, y=value, fill=metric)) + geom_area(alpha=0.6, linewidth=0.5, colour="white") + scale_fill_viridis(discrete = T) + geom_line(data = df, aes(x=time, y=E), inherit.aes = FALSE)
二、将E纳入pivot_longer的实现方案
完全可以把E也纳入宽转长的操作,这样只用一个数据集就能实现需求,逻辑更清晰:
步骤1:把E一起转成长表
df_long_all <- df %>% pivot_longer(cols = c('A', 'B', 'C', 'D', 'E'), names_to='metric', values_to='value')
步骤2:分别过滤数据绘制图层
通过filter()函数分别给geom_area和geom_line指定对应的数据子集:
ggplot() + # 堆叠面积图仅显示A-D组 geom_area(data = df_long_all %>% filter(metric %in% c('A','B','C','D')), aes(x=time, y=value, fill=metric), alpha=0.6, linewidth=0.5, colour="white") + # 折线图仅显示E组 geom_line(data = df_long_all %>% filter(metric == 'E'), aes(x=time, y=value), color="black", linewidth=1) + # 可自定义折线样式 scale_fill_viridis(discrete = T)
内容的提问来源于stack exchange,提问作者5imon
相关产品推荐
相关产品推荐

