如何创建多个绘图,存储在列表中并另存为PDF?

How to create multiple plots, stored in a list, and save as a PDF?

提问人:Grasvreter12345 提问时间:9/28/2023 最后编辑:M--Grasvreter12345 更新时间:9/29/2023 访问量:67

问:

我的循环有问题。我得到了一个包含 25 列和 302 行的数据框。我想使用第 1 列和第 2 列、第 1 列和第 3 列、第 1 列和第 4 列等的 ggplot 绘制图。

当我执行代码时,所有绘制的图都是 x=第 1 列和 y=第 25 列。这是我使用的代码,请注意,我对 R 很陌生。所以我想很多可以更好;-)

我做错了什么?也许这是非常明显的。

#make plots with for loop, store the plots in a list
i <-2
list_plots <- list()
for (i in 2:ncol(plate1)) {

#plot A1
p <-  ggplot(plate1, aes(x=plate1[,1], y=plate1[,i])) + geom_point(col="steelblue", size=1) + 
                  geom_line(col="steelblue", size=1) + 
                  ggtitle(A1) + xlab("Time (h)") + ylab("pH") + 
                  scale_x_continuous(limits = c(xmin, xmax), breaks=seq(xmin, xmax, xbreak)) +
                  scale_y_continuous(limits = c(ymin, ymax), breaks=seq(ymin, ymax, ybreak))
print(i)
list_plots[[i]] <- p

}

#Arrange and save
arrange <- ggarrange(list_plots[[2]], list_plots[[3]], list_plots[[4]], list_plots[[5]], list_plots[[6]], 
                 list_plots[[7]], list_plots[[8]], list_plots[[9]], list_plots[[10]], list_plots[[11]], 
                 list_plots[[12]], list_plots[[13]], list_plots[[14]], list_plots[[15]],  

                 list_plots[[16]], 
                 list_plots[[17]], list_plots[[18]], list_plots[[19]], list_plots[[20]], 
                 list_plots[[21]], 
                 list_plots[[22]], list_plots[[23]], list_plots[[24]], list_plots[[25]], 
                  ncol = 2, nrow = 3)

#save file in current working directory
ggexport(
arrange,
plotlist = NULL,
filename = "whole plate2.pdf")
r list for 循环 ggplot2

评论


答:

1赞 M-- 9/28/2023 #1

更新:

“最简单”的解决方案是创建一个用于绘图的 data.frame,而不是引用iaes;

library(ggplot2)
library(ggpubr)

plate1 <- iris[,-ncol(iris)] ## Creating dummy data using iris dataset
list_plots <- list()

for (i in 2:ncol(plate1)) {
  print(i)
  plot_data <- data.frame(x = plate1[,1], y = plate1[,i])
  p <-  ggplot(plot_data, aes(x, y)) + 
      geom_point(col="steelblue", size=1) + 
      geom_line(col="steelblue", size=1) + 
      ggtitle(i) + xlab("Time (h)") + ylab("pH")
  list_plots[[i-1]] <- p
}
#> [1] 2
#> [1] 3
#> [1] 4

plots_arrange <- ggarrange(list_plots[[1]], list_plots[[3]], list_plots[[2]],
                           ncol = 2, nrow = 3)

plots_arrange


我们可以这样使用:lapply

library(ggplot2)
library(ggpubr)

plate1 <- iris[,-ncol(iris)] ## Creating dummy data using iris dataset

lapply(2:ncol(plate1), function(i){
        ggplot(plate1, aes(x=plate1[[1]], y=plate1[[i]])) + 
          geom_point(col="steelblue", size=1) + 
          geom_line(col="steelblue", size=1) + 
          ggtitle(i) + xlab("Time (h)") + ylab("pH")}) -> list_plots

plots_arrange <- ggarrange(list_plots[[1]], list_plots[[3]], list_plots[[2]],
                     ncol = 2, nrow = 3)

plots_arrange

但我不确定为什么需要遍历列,因为您可以简单地重塑数据并使用分面。

library(ggplot2)
library(dplyr)
library(tidyr)

plate1 <- iris[,-ncol(iris)] ## Creating dummy data using iris dataset

plate1 %>% 
  pivot_longer(-1) %>% 
  ggplot(., aes(x=.[[1]], y=value)) + 
  geom_point(col="steelblue", size=1) + 
  geom_line(col="steelblue", size=1) + 
  facet_wrap(~name, ncol = 2, scales = "free") +
  xlab("Time (h)") + ylab("pH")


但是为什么for循环不起作用呢?应阅读有关 R 中的局部和全局范围:R 中的全局和局部变量

如果我们必须坚持 for 循环,那么这是有效的:

library(ggplot2)
library(ggpubr)

plate1 <- iris[,-ncol(iris)] ## Creating dummy data using iris dataset
list_plots <- list()

for (i in 2:ncol(plate1)) {
  print(i)
  list_plots[[i-1]] <- local({
    i <- i ## this is crucial, assigning i from outer scope to local
    p <-  ggplot(plate1, aes(x=plate1[,1], y=plate1[,i])) + 
      geom_point(col="steelblue", size=1) + 
      geom_line(col="steelblue", size=1) + 
      ggtitle(i) + xlab("Time (h)") + ylab("pH")
    print(p)
  }
  )
}

    #> [1] 2

    #> [1] 3

    #> [1] 4
  
plots_arrange <- ggarrange(list_plots[[1]], list_plots[[3]], list_plots[[2]],
                           ncol = 2, nrow = 3)

plots_arrange