提问人:Grasvreter12345 提问时间:9/28/2023 最后编辑:M--Grasvreter12345 更新时间:9/29/2023 访问量:67
如何创建多个绘图,存储在列表中并另存为PDF?
How to create multiple plots, stored in a list, and save as a PDF?
问:
我的循环有问题。我得到了一个包含 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")
答:
1赞
M--
9/28/2023
#1
更新:
“最简单”的解决方案是创建一个用于绘图的 data.frame,而不是引用i
aes
;
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
评论