为什么在R ggplot2::facet_grid()中传递字符串适用于行而不适用于列



这里有一些解决此问题的方法,但您是否有理由可以在ggplot2::facet_grid()中为rows传递字符串,而不能为cols

这是有效的(注意rows属性(:

f_varname <- 'drv'
ggplot( mpg, aes( displ, cty ) ) + geom_point() +
facet_grid( rows = f_varname )

但这并没有(注意cols属性(:

f_varname <- 'drv'
ggplot( mpg, aes( displ, cty ) ) + geom_point() +
facet_grid( cols = f_varname )
# => Error: `cols` must be `NULL` or a `vars()` specification

相反,您必须为cols:使用vars()规范

ggplot( mpg, aes( displ, cty ) ) + geom_point() +

facet_grid( cols = vars( drv ) )

不能处理字符串:

f_varname <- 'drv'
ggplot( mpg, aes( displ, cty ) ) + geom_point() +

facet_grid( cols = vars( f_varname ) )
# =>
# Error: At least one layer must contain all faceting variables: `f_varname`.
# * Plot is missing `f_varname`
# * Layer 1 is missing `f_varname`

从链接的讨论中,这个答案也适用于字符串:

f_varname <- 'drv'
ggplot( mpg, aes( displ, cty ) ) + geom_point() +

facet_grid( reformulate( f_varname ) )

我认为@Limey在评论中的解释就是你问题的答案,但如果你正在寻找一个实用的解决方案(除了你链接的解决方案之外(,你可以将字符串变成一个符号(使用sym()(,然后用bang-bang运算符将其传递给vars,例如

library(tidyverse)
f_varname <- sym("cyl")
ggplot(mpg, aes(displ, cty)) +
geom_point() +
facet_grid(cols = vars(!!f_varname))

相关内容

最新更新