Создание списка графиков с помощью цикла for - PullRequest
1 голос
/ 18 июня 2020

У меня проблемы с созданием списка графиков с использованием для циклов , и я не знаю почему.

Вот код, который не работает (т.е. возвращает aplotfinal как пустой список)


aplotfinal <- list()
for(i in 1:length(Rlist)){
  a <- Rlist[[i]] %>%
    select(Frame_times, average)
  del <- 0.016667
  x.spec <- spectrum(a$average, log = "no", plot = FALSE)
  spx <- x.spec$freq/del
  spy <- 2*x.spec$spec
  aplotfinal[[i]] <- plot(spy~spx, main = names(Rlist)[i], xlab = "frequency", ylab = "spectral density", type = "l")
}

Функция plot работает, я просто хочу применить ее к списку имеющихся у меня фреймов данных (т.е. Rlist). Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вот пример, который вы можете использовать для настройки вашего кода. Графики сохраняются в переменной plot_list, а затем в pdf, находящемся по адресу path/to/pdf. Обратите внимание, что вы должны сначала запустить устройство (в моем случае pdf).

library(ggplot2)
library(dplyr)

df <- data.frame(country = c(rep('USA',20), rep('Canada',20), rep('Mexico',20)),
                 wave = c(1:20, 1:20, 1:20),
                 par = c(1:20 + 5*runif(20), 21:40 + 10*runif(20), 1:20 + 15*runif(20)))

countries <- unique(df$country)

plot_list <- list()
i <- 1

for (c in countries){
  pl <- ggplot(data = df %>% filter(country == c)) +
    geom_point(aes(wave, par), size = 3, color = 'red') +
    labs(title = as.character(c), x = 'wave', y = 'value') +
    theme_bw(base_size = 16)

  plot_list[[i]] <- pl
  i <- i + 1
}

pdf('path/to/pdf')
pdf.options(width = 9, height = 7)
for (i in 1:length(plot_list)){
  print(plot_list[[i]])
}
dev.off()
1 голос
/ 18 июня 2020

база R plot() не возвращает объект, это просто dr aws на устройстве. Итак, вам нужно сделать мультиплот или сохранить в PDF, чтобы иметь запись графиков.

Чтобы сохранить его в списке, я думаю, вам нужно что-то вроде ggplot, например:

library(ggplot2)
library(gridExtra)

Rlist = lapply(1:5,function(i){
data.frame(Frame_times = seq(0,1,length.out=100),average=runif(100))
})
names(Rlist) = letters[1:5]

aplotfinal <- lapply(1:length(Rlist),function(i){
  a <- Rlist[[i]] %>% select(Frame_times, average)
  del <- 0.016667
  x.spec <- spectrum(a$average, log = "no", plot = FALSE)
  spx <- x.spec$freq/del
  spy <- 2*x.spec$spec
  aplotfinal[[i]] <- qplot(y = spy,x=spx,geom="line") + 
  ggtitle(names(Rlist)[i]) + 
   xlab("frequency")+ylab("spectral density")
})

grid.arrange(grobs=aplotfinal,ncol=5)

enter image description here

...