Можно ли написать функцию, которая будет генерировать несколько графиков, используя ggplot? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь написать функцию, которая будет генерировать несколько гистограмм (по одной для каждого уровня фактора), используя ggplot.

Для набора данных, который я использую, я создал матрицу графиков, используя facet_wrap, но у меня есть 15 уровней для моего фактора, и значения для каждого уровня сильно различаются для каждого бина, поэтому матрица гистограмм была не очень полезна, потому что я вынужден просматривать каждую гистограмму в одном и том же масштабе (например, одинМаксимальный счет для уровня составлял ~ 4000, в то время как для другого уровня был максимальный счет ~ 100).

Ниже приведено то, что я пытаюсь выполнить, используя набор данных iris в качестве примера.

data(iris)
library(tidyverse)

histo_func = function(df){
  species_list = unique(df$Species) #create a vector of levels for Species
  for (i in seq_along(species_list)) {
    species_plot = ggplot(subset(df, df$Species==species_list[i]),
              aes(Sepal.Length)) +
              geom_histogram()
  }
}

species_hist = histo_func(df = iris)

 species_hist
NULL

После запуска функции я вызываю species_hist и получаю NULL.

Сама функция работает - если я перейду через debugonce(), я могу вызвать species_plot и получить гистограмму для любого из нихi В этой точке цикл циклически прошел.

Что я хочу (если возможно), так это сохранять гистограммы в species_hist и иметь возможность выводить все гистограммы подряд после вызова species_hist.

Заранее спасибо за любой вклад.

1 Ответ

0 голосов
/ 19 сентября 2019

Проблема с вашим кодом, "kind_plot" перезаписывается при каждой итерации цикла.Вам нужно будет либо использовать оператор print, как упомянуто в приведенном выше комментарии, либо сохранить объект в списке.
Кроме того, вы не можете точно определить переменную, которая будет возвращена из функции.

histo_func = function(df){
  species_plot=list()
  species_list = unique(df$Species) #create a vector of levels for Species
  for (i in seq_along(species_list)) {
    species_plot[[i]] = ggplot(subset(df, df$Species==species_list[i]),
                          aes(Sepal.Length)) +
      geom_histogram()
  }
  names(species_plot) = species_list
  species_plot
}

species_hist = histo_func(df = iris)

species_hist

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

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