Получить заголовок для графиков при использовании purrr и ggplot с group_by и nest () - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть следующий пример:

df <- mtcars


plot <- df %>% 
  mutate(carb=as.character(carb)) %>% 
  group_by(carb) %>% 
    nest() %>% 
  mutate(plot=map(data, function(.x){ .x  %>%
      ggplot() +
      geom_bar(aes(mpg))
  }))

print(plot)

# A tibble: 6 x 3
  carb  data               plot    
  <chr> <list>             <list>  
1 4     <tibble [10 x 10]> <S3: gg>
2 1     <tibble [7 x 10]>  <S3: gg>
3 2     <tibble [10 x 10]> <S3: gg>
4 3     <tibble [3 x 10]>  <S3: gg>
5 6     <tibble [1 x 10]>  <S3: gg>
6 8     <tibble [1 x 10]>  <S3: gg>

for (i in 1:4){
  print(plots$plot[[i]])
}

Вопросы: 1) Как можно избежать цикла for и использовать функцию map для печати графиков?2) Как я могу добавить заголовок для сюжетов.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Ваш код для создания ваших графиков не имеет особого смысла, но независимо от того, каким образом вы будете давать титры и графические изображения без использования цикла for:

library(tidyverse)

mtcars %>% 
  group_split(carb) %>% 
  imap(~ ggplot(data = .x) + 
        geom_bar(aes(mpg)) +
        labs(title = paste("Plot:", .y, "Carb:", unique(.x$carb))))

Создано в 2019-02-22 пакетом Представление (v0.2.1)

РЕДАКТИРОВАТЬ: я удалил графики, чтобы не переполнить страницу.В этом случае imap() позволяет нам получить доступ к индексу, а также к значению во время итерации.Если вы не хотите указывать номер сюжета в заголовке, тогда map() подойдет.Обратите внимание, что я также использовал group_split(), который находится в новейшей версии library(dplyr).Кроме того, в вашем примере вы создаете тиббл из ggplots, что хорошо, если вы делаете более сложное кодирование, но в случае простого создания графиков вышеуказанный метод работает просто отлично и его легче понять.Если вы хотите разрабатывать более сложные графики, вы можете экстраполировать ggplot из функции map() и поместить ее в свою собственную функцию следующим образом:

plot_carb <- function(df){
  ggplot(data = df) + 
  geom_bar(aes(mpg)) + 
  labs(title = paste(Carb: unique(.x$carb))) + 
  theme_bw()
}

mtcars %>%
group_split(carb) %>%
map(plot_carb)
0 голосов
/ 22 февраля 2019

Создание столбца фрейма данных из ggplot объектов немного необычно и громоздко, но может сработать, если это подходит для ситуации.(Казалось, что geom_bar на самом деле не имеет смысла для этих данных, поэтому я переключился на гистограммы на отфильтрованном подмножестве углеводов).

С помощью вашего метода вы создаете столбец графиков, сохраняете фрейм данных в переменную, затем map2 по списку-столбцу графиков и вектору carb с, добавляя заголовок к каждомусюжет.Затем вы можете распечатать любой элемент из полученного списка или распечатать их все с помощью map или walk.

library(tidyverse)

df <- mtcars %>%
  filter(carb %in% c(1, 2, 4)) %>%
  mutate(carb = as.character(carb))

df_with_plots <- df %>% 
  group_by(carb) %>% 
  nest() %>% 
  mutate(plot = map(data, function(.x) { 
    .x  %>%
      ggplot() +
      geom_histogram(aes(mpg))
  }))

plots1 <- map2(df_with_plots$plot, df_with_plots$carb, ~(.x + labs(title = .y)))

# plots1[[1]] # would print out first plot in the list

walk(plots1, print)

Удалены дополнительные графики дляРади краткости

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

Несколько преимуществ: вызов split дает каждому значению carb в качестве имени соответствующего элемента списка, к которому вы можете легко получить доступ с помощью imap, и который переносится в список plots2(см. ниже, как я напечатал сюжет по имени).Вы также можете сделать это за один шаг.Мне также трудно работать с вложенными данными, потому что я предпочел бы видеть кадры данных, что можно сделать, распечатав разделенный список фреймов данных.

plots2 <- df %>%
  split(.$carb) %>%
  imap(function(carb_df, carb) {
    ggplot(carb_df) +
      geom_histogram(aes(mpg)) +
      labs(title = carb)
  })

plots2[["4"]]

Как и в первом методе, вы можете распечатать все графики с помощью walk(plots2, print).

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