使用 ggplot2 制作多个面板图的整洁评估
Tidy evaluation in making multiple panel plots using ggplot2
我有一个使用 ggplot2 制作多面板图的功能:
plot_facet <- function(df, var.x, var.y, var.facet) {
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!is_missing(var.facet)) p <- p + facet_grid({{var.facet}} ~ .)
return(p)
}
以下调用按预期工作:
plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)
但这不是:
plot_facet(mtcars, mpg, hp, cyl)
我收到错误消息:
Error in is_reference(x, quote(expr = )) : object 'cyl' not found
这个我试过了,也没用:
facet_grid(rows = vars({{var.facet}}))
我该如何解决?感谢您的帮助。
你可以试试这个方法:
library(ggplot2)
plot_facet <- function(df, var.x, var.y, var.facet) {
var <- deparse(substitute(var.facet))
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(var != '') p <- p + facet_grid(reformulate('.', var))
return(p)
}
两者都有效并产生相同的输出。
plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)
plot_facet(mtcars, mpg, hp, cyl)
问题似乎是 is_missing
评估太多(老实说,我从它的帮助页面看不出太多意义)。如果你只是使用 missing
(它只对符号进行操作),你可以使用你的 facet_grid(rows = vars({{var.facet}}))
方法:
library(ggplot2)
library(magrittr)
library(rlang)
plot_facet <- function(df, var.x, var.y, var.facet) {
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
return(p)
}
plot_facet(mtcars, mpg, hp, cyl)
或者,您可以将 var.facet
转换为函数开头的符号,并将其与 is_missing
和 rows
参数一起使用:
plot_facet <- function(df, var.x, var.y, var.facet) {
var.facet <- ensym(var.facet)
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!is_missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
return(p)
}
plot_facet(mtcars, mpg, hp, cyl)
我有一个使用 ggplot2 制作多面板图的功能:
plot_facet <- function(df, var.x, var.y, var.facet) {
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!is_missing(var.facet)) p <- p + facet_grid({{var.facet}} ~ .)
return(p)
}
以下调用按预期工作:
plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)
但这不是:
plot_facet(mtcars, mpg, hp, cyl)
我收到错误消息:
Error in is_reference(x, quote(expr = )) : object 'cyl' not found
这个我试过了,也没用:
facet_grid(rows = vars({{var.facet}}))
我该如何解决?感谢您的帮助。
你可以试试这个方法:
library(ggplot2)
plot_facet <- function(df, var.x, var.y, var.facet) {
var <- deparse(substitute(var.facet))
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(var != '') p <- p + facet_grid(reformulate('.', var))
return(p)
}
两者都有效并产生相同的输出。
plot_facet(mtcars, mpg, hp) + facet_grid(cyl ~ .)
plot_facet(mtcars, mpg, hp, cyl)
问题似乎是 is_missing
评估太多(老实说,我从它的帮助页面看不出太多意义)。如果你只是使用 missing
(它只对符号进行操作),你可以使用你的 facet_grid(rows = vars({{var.facet}}))
方法:
library(ggplot2)
library(magrittr)
library(rlang)
plot_facet <- function(df, var.x, var.y, var.facet) {
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
return(p)
}
plot_facet(mtcars, mpg, hp, cyl)
或者,您可以将 var.facet
转换为函数开头的符号,并将其与 is_missing
和 rows
参数一起使用:
plot_facet <- function(df, var.x, var.y, var.facet) {
var.facet <- ensym(var.facet)
p <- df %>%
ggplot(aes(x = {{var.x}}, y = {{var.y}})) +
geom_point()
if(!is_missing(var.facet)) p <- p + facet_grid(rows = vars({{var.facet}}))
return(p)
}
plot_facet(mtcars, mpg, hp, cyl)