Сохранение участков, выполненных в цикле for - PullRequest
0 голосов
/ 14 сентября 2018

Это мой код:

library(ggplot2)

for(i in 1:4) {

x_i = vector()  
x_i = rnorm(n = 10^(1+i))

plot_i <- ggplot(data = x_i, aes(x = x_i)) +
geom_histogram(aes(y = ..density..), binwidth = .05, col = "blue") +
stat_function(fun = dnorm, args = list(mean = 0, sd = 1), col = "Red") 

}

Я не хочу отображать графики, мне просто нужно хранить их как объекты, чтобы затем я мог передавать их в сетку графиков.

Ранее здесь уже задавался подобный вопрос, например , этот и , этот тоже , но ни один из ответов не дает решения моей проблемы. Когда я запускаю код, я получаю это сообщение об ошибке: «Ошибка: data должен быть фреймом данных или другим объектом, который может быть обработан с помощью fortify(), а не числовым вектором».

РЕДАКТИРОВАТЬ: Гордон заметил, что мне нужно передать data.frame в ggplot. Я изменил x_i на фрейм данных, теперь это код

library(ggplot2)

for(i in 1:4) {


x_i[,1] = data.frame(rnorm(n = 10^(1+i)))

plot_i <- ggplot(data = x_i, aes(x = x_i)) +
geom_histogram(aes(y = ..density..), binwidth = .05, col = "blue") +
stat_function(fun = dnorm, args = list(mean = 0, sd = 1), col = "Red") 

}

Это создало новые вопросы. Я получаю один объект x_i, а не 4 объекта x_1, x_2, x_3, x_4. То же самое случилось с `` plot_i```. Я получаю это сообщение: элемент замены 1 имеет 100 строк для замены 1 элемент замены строк 1 имеет 1000 строк для замены 1 элемент замены 1 строк имеет 10000 строк для замены 1 элемент 1 замены строк имеет 100000 строк для замены 1 строк

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Поскольку в сообщении об ошибке указано, ggplot ожидает фрейм данных в качестве ввода, а вы предоставляете x_i, который представляет собой числовой вектор.Чтобы это исправить, просто сделайте вектор столбцом во фрейме данных.Чтобы сохранить все графики, создайте список и на каждой итерации добавляйте объект ggplot в список.затем вы можете использовать список в качестве входных данных для вашей решетки.

library(ggplot2)
plots <- list()
for(i in 1:4) {

  x_i = data.frame("V1" = rnorm(n = 10^(1+i)))

  plots[[i]] <- ggplot(data = x_i, aes(x = V1)) +
    geom_histogram(aes(y = ..density..), binwidth = .05, col = "blue") +
    stat_function(fun = dnorm, args = list(mean = 0, sd = 1), col = "Red") 

}
0 голосов
/ 14 сентября 2018

Как сказал @ Гордон, вам нужно передать ggplot data.frame вместо vector.Затем вы можете использовать ggsave() в цикле, чтобы сохранить свой график.

for(i in 1:4) {

  x_i = vector()  
  x_i = rnorm(n = 10^(1+i))

  plot_i <- ggplot(data = data.frame(x_i=x_i), aes(x = x_i)) +
    geom_histogram(aes(y = ..density..), binwidth = .05, col = "blue") +
    stat_function(fun = dnorm, args = list(mean = 0, sd = 1), col = "Red") 

  ggplot2::ggsave(plot_i, filename = paste0("plot_",i,".png"))

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...