使用分解变量和geom_hline / geom_vline进行构面

时间:2018-07-04 01:09:07

标签: r ggplot2 facet geom-hline

考虑以下代码:

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帮助我找到了一个调试,即将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必须位于每一层。 (对我来说听起来很神秘)

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

1 个答案:

答案 0 :(得分:1)

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

哈德利说:

  

这是功能方面的一个已知限制-您使用的变量必须存在于每个图层上。

他表示在ggplot中,当您要在构面函数中使用某个函数时,需要在每个geom中包含该变量。发生此问题是因为cyl hline中没有geom变量。

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

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

这可能不是一个完全令人满意的答案,但是如果不阅读ggplot2代码来尝试具体找出出现此限制的原因,那么这可能和您现在所获得的一样好。希望这些解决方法之一足以满足您的需求:)