Как построить большое количество графиков плотности с разными категориальными переменными

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

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 категориальных переменных, так что это займет очень много времени!

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


person DJC    schedule 11.04.2019    source источник
comment
Пожалуйста, предоставьте данные для примера. Я думаю, вам следует преобразовать «данные ширины» в «длинные данные», а затем использовать facet_wrap для построения.   -  person Cobin    schedule 11.04.2019
comment
В моем посте есть воспроизводимый пример?   -  person DJC    schedule 11.04.2019


Ответы (2)


Это решение дает все участки в виде списка. Здесь мы создаем единственную функцию, которая принимает переменную, которую вы хотите построить, а затем используем 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)
person mgiormenti    schedule 11.04.2019
comment
Вы все хорошее в мире. Огромное спасибо! :) - person DJC; 11.04.2019
comment
Одно быстрое продолжение. У меня проблемы с передачей имен столбцов в fill_variables. Прямо сейчас я извлекаю имена столбцов, используя следующий код: Flight_cat ‹- Flight_subset%›% sapply (is.factor)% ›% which () Flights_cat_names‹ - Flight_subset% ›% select (Flight_cat)%›% colnames Знаете ли вы, как Я могу передать этот вектор имен столбцов в 'вары'? - person DJC; 11.04.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)
person mnm    schedule 11.04.2019