从 R 中的 for 循环将多个图形保存在 1 个 pdf 页面中
Saving Multiple graphs in 1 pdf page from a for loop in R
请假设任何数据集。情况:我是 运行 所有自变量的 for 循环,以创建与因变量的关系(散点)图。并希望将绘图保存为 pdf,但 1 个文件的 1 或 2 页 pdf,而不是 1 个单独页面中的每个图形(我已经实现)。我正在使用以下案例
第一次尝试使用开发选项
library(ggplot2)
library(gridExtra)
pdf("one.pdf", onefile = TRUE)
for (i in 1:length(dataset))
{
new_plot[[i]]=print(ggplot(data=dataset, aes(x=dataset[[i]], y=loss))+geom_point(size=1, alpha=0.3)+
geom_smooth(method = lm)+
xlab(paste0(colnames(int[i]), '\n', 'R-Squared: ',round(cor(int[[i]],int$loss, use = 'complete.obs'), 2)))+
ylab("log(loss)") + theme_light())
plot_list = c(new_plot[[i]])
grid.arrange(plot_list)
}
dev.off()
第二次尝试使用 ggsave
for (i in 1:length(dataset))
{
new_plot[[i]]=print(ggplot(data=dataset, aes(x=dataset[[i]], y=loss))+geom_point(size=1, alpha=0.3)+
geom_smooth(method = lm)+
xlab(paste0(colnames(int[i]), '\n', 'R-Squared: ',round(cor(int[[i]],int$loss, use = 'complete.obs'), 2)))+
ylab("log(loss)") + theme_light())
m=marrangeGrob(new_plot[[i]],nrow=2, ncol=2)
}
ggsave("one.pdf",m)
两次我都收到错误
Error in gList(data = list(list(x = c(2213.18, 1283.6, 3005.09, 939.85, :
only 'grobs' allowed in "gList"
此外,如果可能,请分享如何将图表以 2*2(示例)的形式发布在每一页上。我非常感谢提前收到的所有 help.Thanks!
一种简单的方法可能是将数据转换为长格式(使用 tidyr
中的 gather
),然后只需使用 facet_wrap
为您进行排列。这也节省了一些困难的循环并自动包含您可能 need/want.
的任何图例
因为您没有提供任何可重现的数据,这里是一个内置 iris
数据的示例。
iris %>%
gather(Response, Value, -Sepal.Width, -Species) %>%
ggplot(aes(x = Value
, y = Sepal.Width
, col = Species)) +
geom_point() +
geom_smooth(method = "lm") +
facet_wrap(~Response
, scale = "free_x")
给出:
如果出于某种原因,您确实想循环浏览这些图,则可以使用包 cowplot
将内容拼接在一起。上述方法中的一个问题是,您似乎每次都在覆盖绘图列表,而构建所有绘图然后处理它们可能会更好。
在这里,我使用 lapply
而不是 for
,因为它往往工作起来更顺畅。我还使用 aes_string
而不是将向量传递给 aes
,因为这样可以更清楚地了解发生了什么。
myPlots <- lapply(names(iris)[c(1,3,4)], function(thisPredictor){
iris %>%
ggplot(aes_string(x = thisPredictor
, y = "Sepal.Width"
, col = "Species")) +
geom_point() +
geom_smooth(method = "lm")
})
然后,你可以使用plot_grid
把它们放在一起
plot_grid(plotlist = myPlots)
给出:
如果不是传说,这也行得通。幸运的是,这些也很容易处理
plot_grid(
plot_grid(plotlist = lapply(myPlots, function(x){x + theme(legend.position = "none")})
, nrow = 1)
, get_legend(myPlots[[1]] + theme(legend.direction = "horizontal"))
, nrow = 2
, rel_heights = c(9,1) )
给予
请假设任何数据集。情况:我是 运行 所有自变量的 for 循环,以创建与因变量的关系(散点)图。并希望将绘图保存为 pdf,但 1 个文件的 1 或 2 页 pdf,而不是 1 个单独页面中的每个图形(我已经实现)。我正在使用以下案例
第一次尝试使用开发选项
library(ggplot2)
library(gridExtra)
pdf("one.pdf", onefile = TRUE)
for (i in 1:length(dataset))
{
new_plot[[i]]=print(ggplot(data=dataset, aes(x=dataset[[i]], y=loss))+geom_point(size=1, alpha=0.3)+
geom_smooth(method = lm)+
xlab(paste0(colnames(int[i]), '\n', 'R-Squared: ',round(cor(int[[i]],int$loss, use = 'complete.obs'), 2)))+
ylab("log(loss)") + theme_light())
plot_list = c(new_plot[[i]])
grid.arrange(plot_list)
}
dev.off()
第二次尝试使用 ggsave
for (i in 1:length(dataset))
{
new_plot[[i]]=print(ggplot(data=dataset, aes(x=dataset[[i]], y=loss))+geom_point(size=1, alpha=0.3)+
geom_smooth(method = lm)+
xlab(paste0(colnames(int[i]), '\n', 'R-Squared: ',round(cor(int[[i]],int$loss, use = 'complete.obs'), 2)))+
ylab("log(loss)") + theme_light())
m=marrangeGrob(new_plot[[i]],nrow=2, ncol=2)
}
ggsave("one.pdf",m)
两次我都收到错误
Error in gList(data = list(list(x = c(2213.18, 1283.6, 3005.09, 939.85, :
only 'grobs' allowed in "gList"
此外,如果可能,请分享如何将图表以 2*2(示例)的形式发布在每一页上。我非常感谢提前收到的所有 help.Thanks!
一种简单的方法可能是将数据转换为长格式(使用 tidyr
中的 gather
),然后只需使用 facet_wrap
为您进行排列。这也节省了一些困难的循环并自动包含您可能 need/want.
因为您没有提供任何可重现的数据,这里是一个内置 iris
数据的示例。
iris %>%
gather(Response, Value, -Sepal.Width, -Species) %>%
ggplot(aes(x = Value
, y = Sepal.Width
, col = Species)) +
geom_point() +
geom_smooth(method = "lm") +
facet_wrap(~Response
, scale = "free_x")
给出:
如果出于某种原因,您确实想循环浏览这些图,则可以使用包 cowplot
将内容拼接在一起。上述方法中的一个问题是,您似乎每次都在覆盖绘图列表,而构建所有绘图然后处理它们可能会更好。
在这里,我使用 lapply
而不是 for
,因为它往往工作起来更顺畅。我还使用 aes_string
而不是将向量传递给 aes
,因为这样可以更清楚地了解发生了什么。
myPlots <- lapply(names(iris)[c(1,3,4)], function(thisPredictor){
iris %>%
ggplot(aes_string(x = thisPredictor
, y = "Sepal.Width"
, col = "Species")) +
geom_point() +
geom_smooth(method = "lm")
})
然后,你可以使用plot_grid
把它们放在一起
plot_grid(plotlist = myPlots)
给出:
如果不是传说,这也行得通。幸运的是,这些也很容易处理
plot_grid(
plot_grid(plotlist = lapply(myPlots, function(x){x + theme(legend.position = "none")})
, nrow = 1)
, get_legend(myPlots[[1]] + theme(legend.direction = "horizontal"))
, nrow = 2
, rel_heights = c(9,1) )
给予