在单个变量前面加上波浪号(~)的含义是什么(facet_wrap)?

11
我正在学习 Hadley Wickham 的《R 数据科学》一书,在其中他在 ggplot 调用中使用了 ~var
我理解 y ~ a + bx,其中 ~ 描述了因变量和自变量之间的公式/关系,但是 ~var 是什么意思呢?更重要的是,为什么不能直接放置变量本身?请参见下面的代码:
ggplot(data = mpg) + 
  geom_point(mapping = aes(x = displ, y = hwy)) + 
  facet_wrap(~ class, nrow = 2)
demo <- tribble(
  ~cut,         ~freq,
  "Fair",       1610,
  "Good",       4906,
  "Very Good",  12082,
  "Premium",    13791,
  "Ideal",      21551
)

ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut, y = freq), stat = "identity")

4
对于 tribble 函数,使用公式来区分列名和字符数据。这可在 extract_frame_names_from_dots 实现 中看到。 - Artem Sokolov
3个回答

5
这是一个特定于facet_wrap的语法,其中可以将公式作为变量关系的输入。在第一个参数facets的文档中(来自文档)

由vars()引用的一组变量或表达式,定义了在行或列维度上分面组。这些变量可以命名(名称传递给labeller)。为了与经典界面兼容,也可以是公式或字符向量。使用单侧公式'~a b'或字符向量c("a", "b")。

所以我认为现在你只需要提供变量名称而不需要波浪号,但你过去需要使用带有波浪号的单侧公式。

3
你能解释一下什么是单边公式吗? - Hank Lin
3
使用“~”符号创建公式。单侧公式只在一侧包含变量,例如您的示例 ~ class。这些函数选择以这种形式接受它们的输入,这并不意味着像在lm中使用时的实际方程。它没有具体含义,只是表示变量相关,但函数可以选择该关系的含义。 - Calum You
所以我认为现在你可以直接使用变量名而不需要波浪线,但是我想知道为什么会出现这个错误:Error: tribble() 需要使用 ~name 语法至少指定一列。 - Nate Anderson
1
@TheRedPea,那个引用是特指facet_wrap,而不是tribble。在tribble中仍需要使用~来表示列名。 - Calum You

5

这只是ggplot利用formula结构使用户能够决定在哪些变量上进行分面。来自?facet_grid:

为了兼容经典界面,行也可以是一个公式,其中左侧是表格显示的行,右侧是表格显示的列;公式中的点号表示不应在此维度(行或列)上进行分面。

因此,facet_grid(. ~ var)表示在变量var上对网格进行分面,以列为基础进行展示。 这与facet_grid(col = vars(var))相同。

尽管看起来像一个formula,但它实际上并没有作为公式使用:它只是一种以清晰明确的方式向R提供多个参数的方法,以便facet_grid代码能够解释和使用。


0

要理解你问题中的为什么部分,看一下波浪号在绘图中的使用方式。

lattice::xyplot(mpg ~ disp, data=mtcars)

这将disp作为x轴(自变量)和mpg作为y轴(因变量)。类比地,facet_wrap() 将 ~ 右侧作为列来分面(即水平/x/自变量),将左侧作为行来分面(垂直/y/因变量)。如果您只给出 ~ 的右侧,则仅提供列(如上所述,这相当于 facet_grid(col = vars(var)))。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接