使用变量标签作为标题和轴标题时自动执行ggplots [英] automate ggplots while using variable labels as title and axis titles
问题描述
我对NSE和绘图功能感到有些困惑。我正在尝试使用变量标签(而非名称)对轴等进行标注的同时自动绘制一些图。假设我们有一个大型数据集,所有变量都已标记。这里的小例子:
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
我想通过循环遍历其他变量来使该图自动化。因此,我想按 depth
分别对 vars
中的列进行箱线图绘制,这是我想做的。
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)
其他代码尝试
这就是我在想的方法,我想我最好尝试添加标签稍后分别在此处中使用 plot_list $ labels
?
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
vars1 <- c("cut", "color", "clarity")
vars1
#[1] "cut" "color" "clarity"
#unquoted version
vars <- noquote(vars1)
vars
#[1] 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)
感谢任何帮助。
推荐答案
感谢@aosmith @Tung的评论我来了使用以下解决方案:
thanks to the comments @aosmith @Tung I came up with the following solution:
library(cowplot)
library(gridExtra)
library(ggplot2)
library(tidyverse)
my_labels <- c(
cut = "nice cut",
color = "all colours",
clarity = "very claity all",
depth = "test depth"
)
vars <- c("cut", "color", "clarity")
plot_f <- function(df, x_var, y_var, x_var_label, y_var_label) {
ggplot(df, aes(x = .data[[x_var]], y = .data[[y_var]])) +
geom_boxplot(aes(fill = .data[[x_var]])) +
theme_cowplot() +
labs(title = paste("Plot of ", y_var_label, "~", x_var_label), #not .data[[]]
x = x_var_label,
y = y_var_label,
fill = x_var_label)
}
#trick here is that elements of length 1 can be recycled if you wrap it in list
#https://stackoverflow.com/questions/46902461/how-to-pass-a-dataframe-and-uneven-vectors-as-parameters-in-purrr-map
plot_list <- pmap(list(df = list(diamonds), x_var = vars, y_var = list("depth"), x_var_label = my_labels[vars],
y_var_label = list(my_labels[!names(my_labels) %in% vars])), plot_f)
grid.arrange(grobs = plot_list, ncol = 1)
这篇关于使用变量标签作为标题和轴标题时自动执行ggplots的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!