I'm getting a bit mixed up with NSE and a plot function. I'm trying to automate plotting a few plots at once while labeling axis etc. using variable labels (not names). Lets say we have a large dataset with all variables already labelled. Small example here:
library(tidyverse)
library(sjlabelled)
library(ggplot2)
library(cowplot)
data("diamonds")
diamonds <- diamonds %>%
var_labels(
cut ="nice cut",
color = "all colours",
clarity = "very claity all",
depth = "test depth")
The basic plot I want is this:
p1 <- ggplot(diamonds, aes(x = cut, y = depth)) + geom_boxplot(aes(fill = cut)) +
theme_cowplot() +
lab(title = "Plot of test depth ~ nice cut", #based on label variable
x = "nice cut", #based on label variable
y = "test depth", #based on label variable
fill = "nice cut") #based on label variable
p1
I want to automate this plot by cycling through other variables. So I want boxplots of columns in vars
separately by depth
The following is what I'm trying to do.
#firstly i think i should have labels separately (wondering is there a way I can use them directly from variable label?)
my_labels <- c(
cut = "nice cut",
color = "all colours",
clarity = "very claity all",
depth = "test depth"
)
#plot function
plot_f <- function(df, x_var, y_var, x_var_label, y_var_label) {
ggplot(df, aes(x = {{x_var}}, y = {{y_var}})) + geom_boxplot(aes(fill = {{x_var}})) +
theme_cowplot() + labs(title = paste("Plot of", {{x_var_label}}, "~", {{y_var_label}}),
x = {{x_var_label}},
y = {{y_var_label}},
fill = {{x_var_label}})
}
#variables to cycle through
vars <- c("cut", "color", "clarity")
plot_list <- vars %>%
pmap(~plot_f(diamonds, .x, depth, my_labels)) #need to specify y_var_label & x_var_label, is there a
#way I can just specify my_labels here?
#Finally plot lists
grid.arrange(grobs = plot_list, ncol = 1)
Other code attempts
Thats the approach I was thinking, I wonder am I better off trying to add the labels later separately as was done here using plot_list$labels
?
#Also tried a for loop which worked but the fill didnt (and also missing the variable labels)
p <- list()
for(i in vars){
p[[i]] <- ggplot(diamonds, aes_string(x = i, y = "depth", fill = i)) + geom_boxplot() +
#note aes_string instead of aes
theme_cowplot()
}
grid.arrange(grobs = p, ncol = 1)
EDIT
This simpler version plots but the plot isn't capturing the fill correctly and obviously missing the variable labels (paste etc) I want:
#plot function
plot_f <- function(df, x_var, y_var) {
ggplot(df, aes(x = {{x_var}}, y = {{y_var}})) + geom_boxplot(aes(fill = {{x_var}})) +
theme_cowplot()
}
plot_f(diamonds, cut, depth ) #plots fine
#variables to cycle through
vars <- c("cut", "color", "clarity")
#runs
plot_list <- vars %>%
map(., ~plot_f(diamonds, .x, depth))
#plots but fill isn't correct
grid.arrange(grobs = plot_list, ncol = 1)
Any help appreciated.