【问题标题】:Why passing a string in R ggplot2::facet_grid() works for rows but not for columns?为什么在 R ggplot2::facet_grid() 中传递字符串适用于行但不适用于列?
【发布时间】:2021-06-15 08:52:27
【问题描述】:

Here 是解决该问题的一些解决方法,但是您是否有理由可以在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`

从链接的讨论中,answer 也适用于字符串:

f_varname <- 'drv'

ggplot( mpg, aes( displ, cty ) ) + geom_point() +
    
    facet_grid( reformulate( f_varname ) )

【问题讨论】:

  • 从在线文档看来,这是一个遗留功能:“为了与经典界面兼容,行也可以是公式......”。我猜测包含列名称的字符变量可以强制转换为适当的公式。
  • 谢谢@Limey。听起来像是一个可能的解释。不过,这些特性总是让我一直使用 R。

标签: r string ggplot2 facet facet-grid


【解决方案1】:

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

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

【讨论】:

  • 谢谢@jared_mamrot。尽管我真的不了解 Bang Bang 运算符(也不了解数据屏蔽,TBH),但您的解决方案似乎比使用 reformulate() 的解决方案更强大
猜你喜欢
  • 2016-10-06
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
  • 2023-01-11
  • 2017-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多