You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环绘制每个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:15:38