【问题标题】:Modify aes list outside ggplot function修改ggplot函数外的aes列表
【发布时间】:2013-07-15 23:39:53
【问题描述】:

这是我在论坛上第一个关于 R 的问题,如果我在提出问题或指定标题时犯了任何错误,请提前道歉。

重点是,对于 ggplot 的特定任务,我在 ggplot 函数之外定义美学,然后将其作为参数提供。

>mytmpaes<-aes(x=Sample,y=ddCt.lin,ymax=ddCt.lin+ddCt.lin.sd,ymin=ddCt.linddCt.lin.sd,fill=factor(endog))
>my.ggplot(x,mytmpaes)

但有时我只想修改 mytmpaes 列表中的一些对象,而不使用 aes() 重新定义所有对象。但是,我真的不知道如何处理这个特殊的列表。 aes 列表如下所示:

>mytmpaes
List of 5
$ x    : symbol Sample
$ y    : symbol ddCt.lin
$ ymax : language ddCt.lin + ddCt.lin.sd
$ ymin : language ddCt.lin - ddCt.lin.sd
$ fill : language factor(Rep)

我想出了如何像这样修改其中的一些:

 > mytmpaes$x<-as.symbol('Names')
 > mytmpaes$fill<-call('factor',quote(target))
 > mytmpaes
 List of 5
  $ x   : symbol Names
  $ y   : symbol ddCt.lin
  $ ymax: language ddCt.lin + ddCt.lin.sd
  $ ymin: language ddCt.lin - ddCt.lin.sd
  $ fill: language factor(endog)

但是,我找不到使用类似表达式修改 ymax 或 ymin 的方法。 例如,我想将 ymax 更改为 'ddCt.log2 - ddCt.log2.sd'。

有人可以给我一些建议吗?还有,有没有更正确的修改aes列表的方法?

谢谢,

亚历杭德罗

【问题讨论】:

    标签: r ggplot2 aesthetics


    【解决方案1】:

    如果你经常这样做,我建议你使用类似于aes的函数:

    aes.update <- function (aes, ...) 
    {
      aes_new <- structure(as.list(match.call()[-c(1,2)]), class="uneval")
      aes_new <- ggplot2:::rename_aes(aes_new)
      aes[names(aes_new)] <- aes_new
    }
    

    然后你就可以一次全部更新了

    mytmpaes_new <- aes.update(mytmpaes, x=Names, ymax=ddCt.log2 - ddCt.log2.sd)
    

    【讨论】:

    • 我没有尝试过,因为我不需要经常修改 aes,但也感谢这个更详细的解决方案。
    【解决方案2】:

    我想你在找substitute:

    返回(未计算的)表达式 expr 的解析树,替换绑定在 env 中的任何变量

    举个例子:

    df <- data.frame(gp = factor(rep(letters[1:3], each = 10)),
                     y = rnorm(30))
    ##  Make an aes
    tmpaes <- aes(x = gp, y = y , ymin = -2 , ymax = 2 )
    
    ##  Plot with it
    ggplot(df) +
      geom_point( tmpaes )
    
    ##  Modify aes with a new variable
    new <- 10
    tmpaes$ymax <- substitute( new )   
    
    ##  replot
    ggplot(df) +
      geom_point( tmpaes )
    

    【讨论】:

    • 感谢您的快速回答。事实上,它对“符号”和“语言”对象都非常有效。
    【解决方案3】:

    这是最简单的方法:

    > a <- aes(x=Sample,y=ddCt.lin,ymax=ddCt.lin+ddCt.lin.sd,ymin=ddCt.linddCt.lin.sd,fill=factor(endog))
    > a
    List of 5
     $ x   : symbol Sample
     $ y   : symbol ddCt.lin
     $ ymax: language ddCt.lin + ddCt.lin.sd
     $ ymin: symbol ddCt.linddCt.lin.sd
     $ fill: language factor(endog)
    > a$ymax <- aes(ddCt.log2 - ddCt.log2.sd)[[1]]
    > a
    List of 5
     $ x   : symbol Sample
     $ y   : symbol ddCt.lin
     $ ymax: language ddCt.log2 - ddCt.log2.sd
     $ ymin: symbol ddCt.linddCt.lin.sd
     $ fill: language factor(endog)
    

    【讨论】:

    • 耶稣!我不知道为什么我以前没有考虑过这个解决方案。也谢谢
    猜你喜欢
    • 2019-01-02
    • 2014-06-19
    • 2018-08-29
    • 2015-01-31
    • 2014-03-30
    • 2020-03-06
    • 2014-04-12
    • 1970-01-01
    相关资源
    最近更新 更多