基于vec1与vec2对应变量,用ggplot循环绘制多幅折线图
循环生成对应变量的ggplot折线图
首先确保安装并加载ggplot2包:
# 若未安装ggplot2则先执行 # install.packages("ggplot2") library(ggplot2)
方法一:基础for循环
直接遍历vec1和vec2的索引,逐个生成折线图:
# 你的原始数据生成代码 a <- runif(10,5,20) b <- runif(10,2,11) c <- runif(10,12,27) d <- runif(10,19,38) e <- runif(10,4,15) q <- runif(10,11,26) df <- data.frame(A=a,B=b,C=c,D=d,E=e,Q=q) vec1 <- c("Q","A","B","C","D","D","E") vec2 <- c("A","B","C","D","E","Q","B") # 循环生成折线图 for(i in seq_along(vec1)){ x_var <- sym(vec1[i]) y_var <- sym(vec2[i]) p <- ggplot(df, aes(x = !!x_var, y = !!y_var)) + geom_line(group = 1) + # group=1确保折线连接所有点 labs(title = paste0(vec1[i], " vs ", vec2[i]), x = vec1[i], y = vec2[i]) print(p) # 打印每个图 }
方法二:用purrr包实现函数式循环
如果习惯函数式编程,用purrr::map2可以更简洁地批量生成图:
# 若未安装purrr则先执行 # install.packages("purrr") library(purrr) # 定义生成单张图的函数 plot_line <- function(x_col, y_col){ ggplot(df, aes(x = .data[[x_col]], y = .data[[y_col]])) + geom_line(group = 1) + labs(title = paste0(x_col, " vs ", y_col), x = x_col, y = y_col) } # 批量生成所有图,结果是包含7张图的列表 plot_list <- map2(vec1, vec2, plot_line) # 遍历列表打印所有图 walk(plot_list, print)
说明:
sym()和!!是rlang包的语法(ggplot2依赖它),用来将字符串转换为ggplot能识别的变量名;.data[[x_col]]是ggplot2推荐的引用字符串列名的方式,更直观;group=1必须加,因为折线图需要明确分组,否则ggplot会认为每个点是单独分组,无法生成折线。
内容的提问来源于stack exchange,提问作者awz1
相关产品推荐
相关产品推荐

