首页 > 解决方案 > 使用因式分解变量和 geom_hline / geom_vline 进行刻面

问题描述

考虑这段代码:

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. 

谷歌帮我找到了一个debug,即包裹interceptaes

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 在这里写道,作为变量的函数需要存在于每一层中。(这对我来说听起来很神秘)

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

标签: rggplot2facetgeom-hline

解决方案


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

当哈德利说:

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

他的意思是在 ggplot 中,当你要在 facetting 函数中使用一个函数时,你需要在每个geom. cyl出现此问题是因为hline geom.

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

在不研究ggplot2函数的细节的情况下,我猜测aes围绕yintercept参数的作用是为函数提供美学映射geom_hline。该aes函数将变量映射到绘图的组件,而不是静态值。这是一个重要的区别。即使我们仍然设置yintercept = 3,我们已经将它放置在审美映射中,必须以某种方式引用cyl同样存在于这个空间中的东西。也就是说,它与geom_hline间接连接cyl,这意味着它现在在层中,不再是限制。

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


推荐阅读