代码之家  ›  专栏  ›  技术社区  ›  tjebo

带因子变量和geom hline/geom vline的刻面

  •  2
  • tjebo  · 技术社区  · 8 年前

    请考虑以下代码:

    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 回复  |  直到 8 年前
        1
  •  1
  •   LachlanO    8 年前

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

    当哈德利说:

    这是函数刻面的一个已知限制-您使用的变量必须出现在每个层上。

    他是说在ggplot中,当你要在faceting函数中使用一个函数时,你需要在 geom 是的。出现这个问题是因为 cyl 变量不存在于 hline 几何 是的。

    重要的是要记住,这是一种限制,不是理想的行为。更重要的是,他们高效的代码工作的一个结果是,当使用函数来切面时,变量必须存在于 几何 是的。

    而不去调查 ggplot2 函数,我猜是什么包装 aes yintercept 论点是,给 geom_hline 功能。这个 爱依斯 函数将变量映射到绘图组件,而不是静态值。这是一个重要的区别。即使我们还在准备 yintercept = 3 ,事实上,我们把它放在了美学的映射中,一定是以某种方式引用了 气缸 也存在于这个空间中。也就是说,它连接 吉姆林 间接地 气缸

    这可能不是一个完全令人满意的答案,但如果不仔细阅读 代码来尝试并明确为什么会出现这种限制,这可能和您现在得到的一样好。希望其中一个解决方案对您来说足够了:)

    推荐文章