如何在ggplot中通过循环将多份同格式数据框绘制成同图多条曲线
解决方案
有两种实现思路,优先推荐合并所有数据为单个长数据集的方案,符合ggplot的设计规范,后续维护成本更低;也可以通过循环批量生成图层实现需求。
方案1:合并数据后一次性绘图(推荐)
先把所有年份的观测数据整合到同一个数据框中,新增年份列区分不同年份的记录,绘图时自动生成多条曲线,还支持自动生成图例:
library(tidyverse) # 批量读取1956-2019年的所有数据框,合并为单个数据集 all_data <- map_dfr(1956:2019, function(year) { # 提取对应年份的数据框 year_df <- get(paste0("Year", year)) # 新增年份列,用于区分不同曲线 year_df$year <- as.factor(year) return(year_df) }) # 一次绘图生成所有年份的曲线,自动生成图例 ggplot(all_data, aes(x = prob, y = Qmcs, color = year)) + geom_line()
如果不需要按年份区分颜色,删除aes中的color = year参数即可。
方案2:循环批量生成图层
如果确实不需要合并数据,可以通过lapply批量生成所有geom_line图层,再统一添加到ggplot对象中:
library(ggplot2) # 批量生成所有年份的geom_line图层列表 line_layers <- lapply(1956:2019, function(year) { year_df <- get(paste0("Year", year)) # 若需要区分不同年份的曲线,可以自定义color、linetype等参数 geom_line(data = year_df, aes(x = prob, y = Qmcs)) }) # 将所有图层添加到ggplot对象 ggplot() + line_layers
注意:不推荐直接用for循环逐个追加图层,容易因为ggplot的延迟求值特性,导致所有图层都加载最后一年的数据。
内容的提问来源于stack exchange,提问作者Marina
相关产品推荐
相关产品推荐

