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

如何使用for循环将多个ggplot保存至单个PDF文件?

问题:循环生成的ggplot地图仅保存最后一张到PDF,如何合并所有图到同一PDF?

用户当前代码如下:

library(pdftools)
plot <- NA

Indicator <-  unique(map_and_data$Indicator) 
plot<-list (1:length(Indicator))

for (i in 1 : length(Indicator))  
{
  df = map_and_data[map_and_data$Indicator==Indicator[[i]],]
  plot[[i]]<- ggplot()+
          geom_sf(aes(fill=df$NFHS5),color="black",data=df$geometry)+
          labs(title = Indicator[[i]]) 
   ggsave("test.pdf", plot[[i]], device = "pdf")
}

问题:希望将所有绘图(地图)保存到同一个PDF文件中,但目前运行循环后仅保存最后一个Indicator的图,请问该如何解决?


解决方法

核心问题是每次循环调用ggsave时都会覆盖同一个PDF文件,最终只保留最后一次写入的内容。以下是两种可靠的解决方式:

方法1:先收集所有图到列表,再批量导出

先在循环内把所有生成的地图存入列表,循环结束后一次性导出到同一PDF:

library(ggplot2)
library(sf) # 加载sf包以支持geom_sf

# 初始化空列表存储所有绘图
Indicator <- unique(map_and_data$Indicator)
plot_list <- vector("list", length(Indicator))

for (i in 1:length(Indicator)) {
  df <- map_and_data[map_and_data$Indicator == Indicator[[i]], ]
  plot_list[[i]] <- ggplot() +
    geom_sf(aes(fill = NFHS5), color = "black", data = df) + # 直接引用df列,语法更规范
    labs(title = Indicator[[i]])
}

# 将列表中所有图导出到同一个PDF,每页一张图
ggsave("test.pdf", plot = plot_list, device = "pdf")

方法2:使用基础R的PDF设备逐图写入

先打开PDF输出设备,在循环内逐个打印绘图,最后关闭设备完成保存:

library(ggplot2)
library(sf)

Indicator <- unique(map_and_data$Indicator)

# 打开PDF设备,指定输出文件路径
pdf("test.pdf")

for (i in 1:length(Indicator)) {
  df <- map_and_data[map_and_data$Indicator == Indicator[[i]], ]
  p <- ggplot() +
    geom_sf(aes(fill = NFHS5), color = "black", data = df) +
    labs(title = Indicator[[i]])
  print(p) # 循环内必须用print()输出ggplot对象才能写入PDF
}

# 关闭PDF设备,完成文件写入
dev.off()

补充说明

  • 无需加载pdftools包:它主要用于解析、拆分已有PDF,而非生成PDF绘图。
  • 两种方法对比:方法1适合需要后续调整绘图列表的场景;方法2内存占用更低,适合生成大量地图的情况。

内容的提问来源于stack exchange,提问作者I.R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:35:29