如何用循环绘制每个ID的条形图并保存为单个PDF文件
解决方案:批量绘制ID周频率条形图并保存为单PDF
1. 数据格式转换(宽转长)
原数据为宽格式(每周数据单独成列),需转为长格式适配ggplot2的批量绘图逻辑,避免手动处理几十周的列数据。
library(tidyverse) # 整合ggplot2与数据处理工具 # 原始数据定义 ID <- c(12, 34, 560, 45, 235) W1 <- c(0, 5, 7, 6, 0) W2 <- c(7, 8, 9, 5, 2) W3 <- c(0, 0, 3, 5, 9) df <- data.frame(ID, W1, W2, W3) df$ID <- as.factor(df$ID) # 宽格式转长格式,自动匹配所有以W开头的周列 df_long <- df %>% pivot_longer(cols = starts_with("W"), names_to = "Week", values_to = "Frequency") %>% # 强制周按W1、W2...的顺序排列(避免字母序打乱) mutate(Week = factor(Week, levels = paste0("W", 1:(ncol(df)-1))))
2. 批量绘图并保存为单PDF
利用基础R的PDF设备配合循环,高效生成150个ID的图表并统一保存到单个PDF文件中,同时优化图表美学属性提升可读性。
# 初始化PDF输出文件,设置页面尺寸 pdf("ID_weekly_frequency_plots.pdf", width = 8, height = 6) # 循环处理每个ID for (id in unique(df$ID)) { # 筛选当前ID的周数据 current_data <- df_long %>% filter(ID == id) # 绘制条形图并调整样式 p <- ggplot(current_data, aes(x = Week, y = Frequency, fill = Week)) + geom_bar(stat = "identity", width = 0.7) + labs(title = paste("Weekly Frequency for ID:", id), x = "Week", y = "Frequency") + theme_minimal() + theme(plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text = element_text(size = 10), legend.position = "none") # 周已作为x轴,无需重复显示图例 # 将图表写入PDF print(p) } # 关闭PDF设备,完成保存 dev.off()
关键细节说明
- 扩展性:无论周数是30还是更多,
starts_with("W")都会自动匹配所有周列,无需修改代码。 - 效率:循环处理150个ID的速度完全满足需求,单PDF文件避免生成大量零散文件,便于管理。
- 美学优化:采用极简主题、居中加粗标题、调整轴文本大小,同时移除冗余图例,让图表清晰易读。
内容的提问来源于stack exchange,提问作者Tathagato
相关产品推荐
相关产品推荐

