如何解决使用 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,hp,cyl)
然后我收到错误消息:
is_reference(x,quote(expr = )) 中的错误:找不到对象“cyl”
我已经试过了,但它也不起作用:
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,hp,cyl)
,
问题似乎是 is_missing
评估太多(说实话,我对它的帮助页面没有太大意义)。如果您只使用 missing
(仅对符号进行操作),则可以使用 facet_grid(rows = vars({{var.facet}}))
方法:
library(ggplot2)
library(magrittr)
library(rlang)
plot_facet <- function(df,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,cyl)
或者,您可以将 var.facet
转换为函数开头的符号,并将其与 is_missing
和 rows
参数一起使用:
plot_facet <- function(df,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,cyl)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。