Как построить большое количество графиков плотности с разными категориальными переменными - PullRequest
3 голосов
/ 11 апреля 2019

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

library(tidyverse)
library(nycflights13)

dat <- flights %>%
  select(carrier, origin, distance) %>%
  mutate(origin = origin %>% as.factor,
         carrier = carrier %>% as.factor)

plot_1 <- dat %>%
  ggplot(aes(x = distance, fill = carrier)) +
  geom_density()

plot_1

plot_2 <- dat %>%
  ggplot(aes(x = distance, fill = origin)) +
  geom_density()

plot_2

Я хотел бы найти способ быстро сделать эти два графика.Прямо сейчас, единственный способ, которым я знаю, как сделать это, состоит в том, чтобы создать каждый график отдельно, а затем использовать grid_arrange, чтобы собрать их вместе.Тем не менее, мой реальный набор данных имеет что-то вроде 15 категориальных переменных, так что это будет очень много времени!

Есть ли более быстрый и простой способ сделать это?Я считаю, что самое сложное в этом состоит в том, что у каждого сюжета есть своя легенда, поэтому я не уверен, как обойти этот камень преткновения.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

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

fill_variables <- vars(carrier, origin)

func_plot <- function(fill_variable) {
  dat %>%
  ggplot(aes(x = distance, fill = !!fill_variable)) +
  geom_density()
}

plotlist <- lapply(fill_variables, func_plot)

Если вы не знаете, что это за !! в смысле, я рекомендую посмотреть это 5-минутное видео, в котором представлены ключевые понятия аккуратной оценки .Это то, что вы хотите использовать, когда вы хотите создавать такого рода функции-обертки, чтобы делать вещи программно.Надеюсь, это поможет!


Редактировать: Если вы хотите передать массив строк вместо выражения, вы можете изменить !!fill_variable для !!sym(fill_variable) следующим образом:

fill_variables <- c('carrier', 'origin')

func_plot <- function(fill_variable) {
  dat %>%
    ggplot(aes(x = distance, fill = !!sym(fill_variable))) +
    geom_density()
}

plotlist <- lapply(fill_variables, func_plot)
0 голосов
/ 11 апреля 2019

Альтернативное решение

Как писал @djc в комментариях, I'm having trouble passing the column names into 'fill_variables'. Right now I am extracting column names using the following code...

Вы можете разделить категориальные и числовые переменные, например;cat_vars <- flights[, sapply(flights, is.character)] для категориальных переменных и cat_vars <- flights[, sapply(flights, !is.character)] для непрерывных переменных, а затем передать эти векторы в функцию-оболочку, заданную mgiormenti

Полный код приведен ниже;

library(tidyverse)
library(nycflights13)

cat_vars <- flights[, sapply(flights, is.character)]
cont_vars<- flights[, !sapply(flights, is.character)]
dat <- flights %>%
  select(carrier, origin, distance) %>%
  mutate(origin = origin %>% as.factor,
         carrier = carrier %>% as.factor)

func_plot_cat <- function(cat_vars) {
  dat %>%
    ggplot(aes(x = distance, fill = !!cat_vars)) +
    geom_density()
}

func_plot_cont <- function(cont_vars) {
  dat %>%
    ggplot(aes(x = distance, fill = !!cont_vars)) +
    geom_point()
}

plotlist_cat_vars <- lapply(cat_vars, func_plot_cat)
plotlist_cont_vars<- lapply(cont_vars, func_plot_cont)
print(plotlist_cat_vars)
print(plotlist_cont_vars)
...