ループのなかでggplot {ggplot2}を利用して作成した図をリストに格納する一つの方法です。
始めに問題なく格納できるサンプルを確認します。
次のサンプルではループ(iter、4回転)のなかで毎回ランダムにデータ(y、各サイズ(n)は5個)を作成後に散布図を作成してリスト(ggplot_list)に格納し、格納した4つの図をpatchworkで結合して表示しています(Figure 1)。
作成したサンプルデータ(df_sample、Table 1)と比較して何ら問題は見られません。
library(dplyr)
library(ggplot2)
library(patchwork)
set.seed(20250106)
<- 3
pointsize <- list()
ggplot_list <- 5
n <- 4
iter <- seq(n)
x <- matrix(nrow = n, ncol = iter)
df_sample for (ccc in seq(iter)) {
<- rnorm(n) %>% round()
y <- ggplot(data = data.frame(x = x, y = y), mapping = aes(x = x, y = y)) +
ggplot_list[[ccc]] geom_point(size = pointsize) +
labs(title = ccc) +
geom_hline(yintercept = 0, colour = "red")
<- y
df_sample[, ccc]
}Reduce(function(x, y) x + y, ggplot_list)
作成したサンプルデータです。
続いて始めにループ外で作成したサンプルデータ(df_sample)をループのなかで取り出して、同様に図を作成します(Figure 2)。
4つの図が全て最後のデータ(df_sample( Table 1 )の4列目)の散布図を表示しています。
<- list()
ggplot_list for (ccc in seq(iter)) {
<- df_sample[, ccc]
y <- ggplot(mapping = aes(x = x, y = y)) +
ggplot_list[[ccc]] geom_point(size = pointsize) +
labs(title = ccc) +
geom_hline(yintercept = 0, colour = "red")
}Reduce(function(x, y) x + y, ggplot_list)
そんなときの一つの解決方法です。
図を作成するコードを関数としてループの外に出してしまいます(Figure 3)。
問題なく表示され、Figure 1 と Figure 3 が同一であることが確認できます。
<- function(ccc) {
fun_plot <- df_sample[, ccc]
y ggplot(mapping = aes(x = x, y = y)) +
geom_point(size = pointsize) +
labs(title = ccc) +
geom_hline(yintercept = 0, colour = "red")
}<- list()
ggplot_list for (ccc in seq(iter)) {
<- fun_plot(ccc = ccc)
ggplot_list[[ccc]]
}Reduce(function(x, y) x + y, ggplot_list)
以上です。