我有多个图要另存为.pdf
文件,它们是使用par(mfrow=c(1,2))
在R中创建的,即每个图形(要保存)有2个图,按1行和2列排列
由于我的地块总数很高,所以我要使用for循环来创建地块。
如何将图形(每个图形有2个图)保存为for循环中的pdf文件?
以下是相同的代码:
## create data.frames
df_1 = data.frame(x = c(1:100), y = rnorm(100))
df_2 = data.frame(x = c(1:100), y = rnorm(100))
df_3 = data.frame(x = c(1:100), y = rnorm(100))
df_4 = data.frame(x = c(1:100), y = rnorm(100))
## create list of data.frames
df_lst = list(df_1, df_2, df_3, df_4)
## plot in for loop by 1 row and 2 cols
par(mar=c(3,3,1,0), mfrow=c(1,2))
for (i in 1:length(df_lst)) {
barplot(df_lst[[i]]$y)
}
比方说,我想使用pdf
函数保存图表。这是我尝试过的:
for (i in 1:length(df_lst)) {
pdf(paste('my/directory/file_Name_', i, '.pdf', sep = ''), height = 6, width = 12)
barplot(df_lst[[i]]$y)
dev.off()
}
我的解决方案显然是错误的,因为pdf
函数在每个循环中保存一个数字(即4而不是2)。
有什么建议吗? 谢谢
答案 0 :(得分:1)
类似的声音可以在此处使用嵌套循环:创建的每个文件的外部循环,以及创建的每个多面板图形的内部循环。由于所有数据帧都存储在一维列表中,因此您需要跟踪要绘制的列表的索引。
这是一种方法:
nrow <- 1
ncol <- 2
n_panels <- nrow * ncol
n_files <- length(df_lst) / n_panels
for (i in seq_len(n_files)) {
file <- paste0("file_", i, ".pdf")
pdf(file, height = 6, width = 12)
# plot params need to be set for each device
par(mar = c(3, 3, 1, 0), mfrow = c(nrow, ncol))
for (j in seq_len(n_panels)) {
idx <- (i - 1) * n_panels + j
barplot(df_lst[[idx]]$y)
}
# updated to also add a legend
legend("bottom", legend = "Bar", fill = "grey")
dev.off()
}
如果您只希望一个文件包含多页,则只需将pdf()
调用移至原始循环之外,然后将参数设置移至pdf()
之后:
pdf('my/directory/file_Name.pdf', height = 6, width = 12)
par(mar=c(3,3,1,0), mfrow=c(1,2))
for (i in 1:length(df_lst)) {
barplot(df_lst[[i]]$y)
}
dev.off()