如何通过for循环或迭代方法批量绘制xyplot()图形?
问题描述
我有如下数据集:
df <- structure(list(ID = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), Vid = c(0, 0, 1, 1, 0, 1, 1, 0, 0, 1), Mus = c(1, 0, 1, 1, 0, 1, 0, 0, 1, 1), Rea = c(1, 0, 1, 1, 1, 1, 1, 0, 0, 0), Ema = c(1, 0, 0, 1, 0, 0, 0, 1, 0, 0), SMS = c(1, 0, 1, 1, 0, 0, 0, 0, 0, 0), tel = c(0, 0, 0, 1, 0, 0, 0, 0, 1, 0), MMT = c(53, 17.5, 48.5, 40, 19.5, 37.5, 25, 17.5, 22.5, 18.5), rec = c(0.986090887933027, 0.0680321184694875, 0.968640096476421, 0.865412998525399, 0.100122305069044, 0.802091434784794, 0.261753760392736, 0.0680321184694875, 0.173118039249657, 0.0826713725018173 ), MM_levels = c("HMM", "IMM", "HMM", "IMM", "IMM", "IMM", "IMM", "IMM", "IMM", "IMM")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"))
尝试用以下for循环批量绘制xyplot()图形:
for(i in names(df[c(2:7,9)])){ xyplot(x = i, y = "rec", data = as.data.frame(df), necessity = TRUE, jitter = TRUE, xlab = names(i), ylab = "rec") }
运行无报错但无法生成预期的系列图形,求调整循环或替代方法实现批量绘图。
解决方案
核心问题分析
xyplot属于lattice包的网格图形系统,这类图形在循环中不会自动渲染输出,必须显式调用print()函数才能显示;另外原代码中xlab = names(i)是错误的,i本身就是列名,直接使用i即可。
调整后的for循环代码
library(lattice) # 遍历目标列名 for(i in names(df[c(2:7,9)])){ # 创建图形对象 plot_obj <- xyplot(x = i, y = "rec", data = as.data.frame(df), necessity = TRUE, jitter = TRUE, xlab = i, ylab = "rec") # 显式打印图形 print(plot_obj) }
替代方案:用purrr实现tidy风格批量绘图
如果习惯tidyverse工具链,可以用purrr::walk来迭代,自动处理图形打印:
library(lattice) library(purrr) # 提取需要绘图的列名 target_columns <- names(df[c(2:7,9)]) # 批量生成并打印图形 walk(target_columns, function(col){ plot_obj <- xyplot(x = col, y = "rec", data = df, necessity = TRUE, jitter = TRUE, xlab = col, ylab = "rec") print(plot_obj) })
拓展:批量保存图形到文件
如果需要将所有图形保存到文件(比如PDF),可以在循环中加入图形设备函数:
library(lattice) target_columns <- names(df[c(2:7,9)]) # 打开PDF设备,每个图形占一页 pdf("batch_xyplots.pdf", width = 8, height = 6) for(i in target_columns){ plot_obj <- xyplot(x = i, y = "rec", data = df, necessity = TRUE, jitter = TRUE, xlab = i, ylab = "rec") print(plot_obj) } # 关闭设备 dev.off()
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

