使用因式分解变量和 geom_hline / geom_vline 进行刻面

Posted

技术标签:

【中文标题】使用因式分解变量和 geom_hline / geom_vline 进行刻面【英文标题】:Facetting with factorised variables and geom_hline / geom_vline 【发布时间】:2018-12-12 08:34:54 【问题描述】:

考虑这段代码:

require(ggplot2)

ggplot(data = mtcars) +
  geom_point(aes(x = drat, y = wt)) +
  geom_hline(yintercept = 3) +
  facet_grid(~ cyl)                       ## works

ggplot(data = mtcars) +
  geom_point(aes(x = drat, y = wt)) +
  geom_hline(yintercept = 3) +
  facet_grid(~ factor(cyl))              ## does not work

# Error in factor(cyl) : object 'cyl' not found

# removing geom_hline: works again. 

Google帮我找到了一个debug,即将intercept包装成aes

ggplot(data = mtcars) +
  geom_point(aes(x = drat, y = wt)) +
  geom_hline(aes(yintercept = 3)) +
  facet_grid(~ factor(cyl))                  # works

# R version 3.4.3 (2017-11-30)  
# ggplot2_2.2.1

Hadley writes here 作为变量的函数需要在每一层中。 (这对我来说听起来很神秘)

为什么在分解构面变量时会发生这种情况?

【问题讨论】:

从您提供的链接看来,这是一个已知的限制。至少有一个解决方法。 @MHammer 感谢您的考虑-但是,它没有回答我的问题,为什么仅在分解时才会发生这种情况。你有什么想法 【参考方案1】:

所以这是我最好的猜测和解释。

当哈德利说:

这是使用函数进行刻面的已知限制 - 您使用的变量必须存在于每一层。

他的意思是在ggplot中,当你要在分面函数中使用一个函数时,你需要在每个geom中都有变量。出现此问题的原因是 cyl 变量在 hline geom 中不存在。

重要的是要记住,这是一个限制,而不是理想的行为。此外,他们的高效代码如何工作的一个结果是,当使用函数进行构面时,变量必须存在于每个 geom 中。

在不研究ggplot2 函数的细节的情况下,我猜测将aes 包裹在yintercept 参数周围的作用是为geom_hline 函数提供美学映射。 aes 函数将变量映射到绘图的组件,而不是静态值。这是一个重要的区别。尽管我们仍然设置了yintercept = 3,但我们将其置于美学映射中的事实必须以某种方式引用cyl 也存在于这个空间中。也就是说,它间接连接了geom_hlinecyl,这意味着它现在在层中,不再是限制。

这可能不是一个完全令人满意的答案,但如果不阅读ggplot2 代码来尝试具体了解为什么会出现此限制,这可能与您现在得到的一样好。希望这些解决方法之一对您来说就足够了:)

【讨论】:

哎呀。终于明白了哈哈。谢谢!!

以上是关于使用因式分解变量和 geom_hline / geom_vline 进行刻面的主要内容,如果未能解决你的问题,请参考以下文章

ggplot geom_hline 中无法识别的数据列

如何在同一个散点图上使用 geom_vline() 和 geom_hline 避免图例中的交叉效应?

使用循环在构面中创建多个 geom_hline 对象时,如何有效地创建手动图例?

图例中 geom_hline 的颜色不正确 [ggplot2]

图例 geom_hline 顺序不正确

在使用 gghighlight 时为几个 geom_hlines 创建图例