如何使用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
相关产品推荐
相关产品推荐

