Создайте разные графики для каждого столбца в кадре данных в одном окне. - PullRequest
0 голосов
/ 04 ноября 2018

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

Для переменной VARIABLE мой код выглядит так:

variable_name_string = "VARIABLE"

hist = qplot(VARIABLE, data = full_data_noNO, geom="histogram", 
fill=I("lightblue"))+
theme_light()

avg_price = full_data_noNO %>% 
group_by(Month, Country) %>%
dplyr::summarize(avg = mean(VARIABLE, na.rm = 
TRUE))

#line graph for different countries over time
line = ggplot(data=avg_price, aes(x=anydate(Month), y=VARIABLE, 
group=Country)) +
xlab("Date")+
ylab(variable_name_string)+
geom_line(aes(color=Country), size = 1)+
theme_light()

#boxplot over different years
avg_price2 = avg_price
avg_price2$Month = format(as.Date(anydate(avg_price$Month), "%Y-%m-%d"), 
"%Y")

box = ggplot(avg_price2, aes(x = Month, y=VARIABLE, fill = Month)) + 
geom_boxplot()+
xlab("Date")+
ylab(variable_name_string)+
guides(fill=FALSE)+
theme_light()

var_name = grid.text(variable_name_string, gp=gpar(fontsize=20))

#merge plot into one window
grid.arrange(var_name, hist, line, box, ncol=2)

Это прекрасно работает для одной переменной, но теперь я хочу сделать это для каждой переменной в моем фрейме данных и сохранить окно объединенного графика для всех переменных. Я искал почти весь день, но я не могу найти решение. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 04 ноября 2018

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

make_plots <- function (variable_string) {
  var_quo <- rlang::sym(variable_string)
  hist = qplot(!!var_quo, data = full_data_noNO, geom="histogram", 
               fill=I("lightblue"))+
    theme_light()

  avg_price = full_data_noNO %>% 
    group_by(Month, Country) %>%
    dplyr::summarize(avg = mean(!!var_quo, na.rm = 
                                  TRUE))

  #line graph for different countries over time
  line = ggplot(data=avg_price, aes(x=anydate(Month), y=!!var_quo, 
                                    group=Country)) +
    xlab("Date")+
    ylab(variable_string)+
    geom_line(aes(color=Country), size = 1)+
    theme_light()

  #boxplot over different years
  avg_price2 = avg_price
  avg_price2$Month = format(as.Date(anydate(avg_price$Month), "%Y-%m-%d"), 
                            "%Y")

  box = ggplot(avg_price2, aes(x = Month, y=!!var_quo, fill = Month)) + 
    geom_boxplot()+
    xlab("Date")+
    ylab(variable_string)+
    guides(fill=FALSE)+
    theme_light()

  var_name = grid.text(!!var_quo, gp=gpar(fontsize=20))

  #merge plot into one window
  combined <- grid.arrange(var_name, hist, line, box, ncol=2)

  # Save combined plot at VARIABLE_plots.pdf
  ggsave(paste0(variable_string, "_plots.pdf"), combined)
  combined
}

# Make sure to pass the variable names as character vector
plots <- lapply(c("VARIABLE1", "VARIABLE2"), make_plots)
# OR
plots <- lapply(colnames(full_data_noNO), make_plots)

# Plots can also be accessed and printed individually
print(plots[["VARIABLE1"]])
...