Использование pmap в ggplot2 для автоматизации построения графиков различных наборов данных - PullRequest
0 голосов
/ 15 июня 2019

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

Так как функция имеет три аргумента (набор данных, ось x и ось y), я использую pmap () из purrr.

Функция работает нормально, когда я удаляю аргумент набора данных ииспользуйте map2 () вместо pmap ()

Вот код, который я написал:

forest_day <- forest %>% group_by(day) %>% summarise(n())%>%rename(count1 = `n()`)
forest_month <- forest %>% group_by(month) %>% summarise(n())%>%rename(count1 = `n()`)

pbar <- function(data, x, y) {
  ggplot(data = data) + aes_string(x = x, y = y) + geom_bar(stat = 'identity')
}

l1 <- list(forest_month, forest_month$month, forest_month$count1)
pmap(l1, pbar)
l2 <- list(forest_day, forest_day$day, forest_day$count1)
pmap(l2,pbar)

Код ошибки, который я получаю при использовании pmap (), таков:

«Элемент 1 из .l должен иметь длину 1 или 12, а не 2»

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 15 июня 2019

Поскольку у меня нет ваших данных, я генерирую свои собственные наборы данных, используя mtcars и iris. Использование get(data) в вызове ggplot должно решить вашу проблему. Обратите внимание, что вы должны предоставить все аргументы в виде строк. В вашем собственном примере вы уже используете aes_string, поэтому x и y должны быть представлены в виде строк. Использование get принимает строку в качестве аргумента и ищет объект в вашей глобальной среде.

library(dplyr)
library(ggplot2)
library(purrr)

mtcars_cyl <- mtcars %>% group_by(cyl) %>% summarise(count1 = n())
iris_Species <- iris %>% group_by(Species) %>% summarise(count1 = n())

pbar <- function(data, x, y) {
  ggplot(data = get(data), aes_string(x = x, y = y)) + geom_bar(stat = 'identity')
}

l1 <- list("mtcars_cyl","cyl", "count1")
pmap(l1, pbar)
map2("cyl", "count1" )
l2 <- list("iris_Species", "Species", "count1")
pmap(l2,pbar)

Если вы всегда используете одну и ту же переменную y count1. Тогда вы можете использовать map2. Вот пример, где у вас есть два списка. Один список, ls_data, предоставляющий кадры данных для зацикливания, и один список, ls_x, предоставляющий аргумент x для ggplot2. count1 затем определяется внутри лямбда-функции внутри map2. Вызов map2 дал оба сюжета одновременно. В качестве альтернативы walk2 создаст графики без печати [[1]] [[2]] на консоли.

ls_data <- list("mtcars_cyl","iris_Species")
ls_x <- list("cyl","Species")

map2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))
walk2(ls_data, ls_x, ~ pbar(.x, .y, "count1"))

Другой способ вызова map2 - поместить оба аргумента в именованный список с именем наборов данных в качестве имени списка и x-аргументом в качестве ввода списка.

args <- c(mtcars_cyl = "cyl",
          iris_Species = "Species")

map2(names(args), args, ~ pbar(.x, .y, "count1"))

Удачи с вашими данными.

...