【问题标题】:Combine/Merge two ggplot aesthetics合并/合并两个 ggplot 美学
【发布时间】:2013-11-19 23:09:02
【问题描述】:

假设我有两个 ggplot 美学:

a.1 <- aes(v.1=1, v.2=2)
a.2 <- aes(v.3=3)

有没有办法结合已经建立的美学?在我的示例中,它将类似于:

a.merged <- aes(v.1=2, v.2=2,v.3=3)

我知道 aes_string 可用于从可以连接的字符向量构建美学,但我正在研究两种美学已经构建的情况,我想避免必须先将它们转换为字符.

【问题讨论】:

    标签: r ggplot2 aesthetics


    【解决方案1】:
    > c(a.1,a.2)
    $v.1
    [1] 1
    
    $v.2
    [1] 2
    
    $v.3
    [1] 3
    

    aes 对象是“未计算的表达式”,c() 函数按预期工作,具体取决于您对“预期”的定义。为了安全起见,您可能需要重新添加被c() 剥离的类:

    a.merged <- c(a.1,a.2)
    class(a.merged) <- "uneval"
    

    如果您想一步完成,那么函数modifyList 将不会去除“name”-less 属性:

    > modifyList(a.1, a.2)
    List of 3
     $ v.1: num 1
     $ v.2: num 2
     $ v.3: num 3
    > attributes(modifyList(a.1, a.2))
    $names
    [1] "v.1" "v.2" "v.3"
    
    $class
    [1] "uneval"
    

    【讨论】:

    • 我明白了,我之前尝试过 c() 但没有意识到我可以简单地添加回类。谢谢!
    • 在 ggplot2 2.2.1 版中,似乎有必要使用modifyList。仅使用c() 会导致错误:“映射必须由 aes() 或 aes_() 创建”。
    【解决方案2】:
    library(ggplot2)
    
    a.1 <- aes(v.1=1, v.2=2)
    a.2 <- aes(v.3=3)
    
    modifyList(a.1, a.2)
    
    Aesthetic mapping: 
    * `v.1` -> 1
    * `v.2` -> 2
    * `v.3` -> 3
    

    modifyList 不会改变它的参数,尽管有名字。感谢Simon.S.A. 提出这种方法in the comments

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 2021-05-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2016-06-05
      相关资源
      最近更新 更多