R语言如何按唯一UID绘制单图多组浊度-时间曲线并批量导出
R浊度时间序列绘图实现方案
原代码问题梳理
- 变量名拼写错误:
data_long错写为datalong - 未生成
Gen与Type的组合分组列,无法生成符合要求的图例 - 未按
UID筛选子数据集,无法单独生成每个UID对应的独立图表 par(mfrow)仅对R基础绘图生效,对ggplot2对象不生效- 映射参数错误:不存在
Tree列,映射逻辑不符合需求
完整实现代码
# 加载依赖包 library(ggplot2) library(tidyr) library(dplyr) library(patchwork) # 用于多图排版 # 修正后的示例数据集(原代码Gen大小写错误) Gen <- c('M','M','M','M','F','F','F','F','M','M','M','M','F','F','F','F') Site <- rep('FRX',length(Gen)) Type <- c('L','L','L','L','L','L','L','L','R','R','R','R','R','R','R','R') UID <- c(1001,1002,1003,1004,1001,1002,1003,1004,1001,1002,1003,1004,1001,1002,1003,1004) Time_1 <- c(100.78,112.34,108.52,139.19,149.02,177.77,79.18,89.10,106.78,102.34,128.52,119.19,129.02,147.77,169.18,170.11) Time_2 <- c(150.78,162.34,188.53,197.69,208.07,217.76,229.48,139.51,146.87,182.54,189.57,199.97,229.28,247.73,269.91,249.19) Time_3 <- c(250.78,262.34,288.53,297.69,308.07,317.7,329.81,339.15,346.87,382.54,369.59,399.97,329.28,347.73,369.91,349.19) df <- data.frame(Gen,Site,Type,UID,Time_1,Time_2,Time_3) # 自定义绘图函数 graphplotter <- function(df, export_type = "pdf", output_path = "turbidity_time"){ # 1. 宽表转长表,生成分组列 data_long <- df %>% mutate(group = paste0(Gen, "-", Type)) %>% # 生成M-L/F-L等分组用于图例 pivot_longer(cols = starts_with("Time_"), names_to = "Time", values_to = "Turbidity") %>% mutate(Time = factor(Time, levels = c("Time_1", "Time_2", "Time_3"))) # 固定横轴顺序 # 2. 遍历每个UID生成单图 uid_list <- unique(data_long$UID) plot_list <- lapply(uid_list, function(uid){ sub_data <- filter(data_long, UID == uid) p <- ggplot(sub_data, aes(x = Time, y = Turbidity, color = group, group = group)) + geom_line(linewidth = 1) + geom_point(size = 2) + labs(title = paste0("UID:", uid), x = "时间", y = "浊度", color = "分组") + theme_bw() + theme( legend.position = "top", plot.title = element_text(hjust = 0.5) ) return(p) }) # 3. 2行2列排版,导出文件 combine_plot <- wrap_plots(plot_list, nrow = 2, ncol = 2) # 每页4张图 # 按指定格式导出 if(export_type == "pdf"){ ggsave(paste0(output_path, ".pdf"), combine_plot, width = 12, height = 10) } else if(export_type == "jpeg"){ ggsave(paste0(output_path, ".jpeg"), combine_plot, width = 12, height = 10, dpi = 300) } else if(export_type == "tiff"){ ggsave(paste0(output_path, ".tiff"), combine_plot, width = 12, height = 10, dpi = 300) } # 返回绘图对象方便调试 return(combine_plot) } # 调用函数,可通过export_type参数指定导出格式:pdf/jpeg/tiff result_plot <- graphplotter(df, export_type = "pdf") # 本地查看绘图效果 print(result_plot)
功能说明
- 支持三种格式导出,默认导出pdf,可通过
export_type参数切换 - 每个UID的单图内包含4条对应
M-L/F-L/M-R/F-R的曲线,附带对应图例 - 自动按2行2列排布4张图,横轴固定为Time_1/Time_2/Time_3顺序
- 标题自动匹配对应UID,格式符合需求
内容的提问来源于stack exchange,提问作者nasa313
相关产品推荐
相关产品推荐

