Добавление графиков в список ggplot2

Я пытаюсь добавить графики ggplot2 в список, чтобы я мог использовать функцию ggarrange из ggpubr, чтобы организовать их на нескольких страницах.

Поскольку существует несколько сотен графиков, я использую функцию для генерации и сохранения графиков, но я не могу заставить ее возвращать графики в среду или записывать имена в список.

Я совершенно уверен, что это что-то простое, что я скучаю, но не могу это заметить.

Используемая мной функция построения графиков:

histFacet.plot <- function(x, results, info, ...) {

  md<- names(x) %in% c("rn","Taxa","year","rep","block","column",
                       "range", "entity_id")
  traits <- names(x[ , !md])
  for (i in traits) {
    i <-ggplot(data = x, aes_string(x = i)) + 
      geom_histogram(colour="black", fill="white") + 
      #facet_grid(x$year ~ .) +
      theme_bw() +
      xlab(paste0(i)) +
      ylab("Frequency") +
      theme(panel.grid.major = element_blank()) +
      theme(panel.grid.minor = element_blank()) +
      theme(axis.text = element_text(size = 15)) +
      theme(axis.title = element_text(size = 15)) +
      theme(strip.text = element_text(size = 15)) 
    #ggsave(paste0(i,"_",info,".pdf"),path=paste(results, sep=''))
    plotList<- list(plotList, list(i))
    print(i)

  }
  return(i)
}

histFacet.plot(pd,'~/Dropbox/Research_Poland_Lab/AM Panel/Figures/Hist/',
               "_raw_2018")

1 ответ

Решение

Ваша большая проблема в том, что вы return(i) вместо return(plotList), Переназначение i внутри for использование цикла i как в итераторе это странно. Особенно, когда сюжет использует i как строка... я бы попробовал это:

histFacet.plot <- function(x, results, info, ...) {

  md <- names(x) %in% c("rn","Taxa","year","rep","block","column",
                       "range", "entity_id")
  traits <- names(x[ , !md])
    plotList = list()
    for (i in traits) {
        thisPlot <- ggplot(data = x, aes_string(x = i)) + 
          geom_histogram(colour="black", fill="white") + 
          #facet_grid(x$year ~ .) +
          theme_bw() +
          xlab(i) +
          ylab("Frequency") +
          theme(panel.grid.major = element_blank()) +
          theme(panel.grid.minor = element_blank()) +
          theme(axis.text = element_text(size = 15)) +
          theme(axis.title = element_text(size = 15)) +
          theme(strip.text = element_text(size = 15)) 

        plotList[[i]] = thisPlot
        print(i)

      }
      return(plotList)
}

Конечно, не проверялось, поскольку вы не предоставляли образцы данных. Рад проверить / отладить, если вы предоставите небольшой, воспроизводимый пример набора данных.

Я не совсем уверен, если вы хотите print(i) распечатать график на графическом устройстве (если это так, измените на print(thisPlot)) или распечатать текущую черту в консоль, чтобы обновить прогресс в цикле (если это так, измените на message(i) чтобы было легко отключить).

Пара других заметок: если вы огранены, используйте year ~ . как формула, а не x$year ~ ., Если i это уже персонаж, то paste0(i) такой же как i (в вашем xlab).

Другие вопросы по тегам