代码之家  ›  专栏  ›  技术社区  ›  tonytonov QIBIN LI

在现有映射对象中添加或重写aes

  •  10
  • tonytonov QIBIN LI  · 技术社区  · 12 年前

    以下是最小的情况:

    df <- data.frame(x=1:5, y=1, col=1:5)
    mapping <- aes(x=x, y=y)
    ggplot(df, mapping) + geom_point(size=10)
    

    现在我想在现有的基础上添加(或覆盖)另一种美学(颜色) mapping 对象所需的绘图为

    ggplot(df, aes(x=x, y=y, colour=col)) + geom_point(size=10)
    

    我肯定有一个方便的功能,但它没有在文档中列出,浏览源代码也没有帮助。我曾经似乎偶然发现了 AddOrOverrideAes ,但不知道具体在哪里。

    以下是我当前的解决方案:

    add_aes <- function (mapping, ...) {
       new_aes <- structure(append(mapping, as.list(match.call()[-(1:2)])), class = "uneval")
       rename_aes(new_aes)
    }
    
    environment(add_aes) <- asNamespace("ggplot2")
    ggplot(df, add_aes(mapping, colour=col)) + geom_point(size=10)
    

    它适用于添加,但不适用于覆盖(不检查该aes是否已存在等)。我是在重新发明轮子吗?

    这是GGally的动机 ggpairs 自定义,请参见 this question.

    编辑:

    工作流程如下:获取现有 映射 作为参数,在适当位置修改它并进一步传递给另一个函数。我无法修改“最终”ggplot调用。

    1 回复  |  直到 9 年前
        1
  •  4
  •   tonytonov QIBIN LI    12 年前

    根据@koshke的评论,这里有一个工作示例:

    df <- data.frame(x=1:5, y=1, new_y=5:1, col=1:5, new_col=factor(1:5))
    mapping <- aes(x=x, y=y, col=col)
    ggplot(df, mapping) + geom_point(size=10)
    
    add_modify_aes <- function(mapping, ...) {
      ggplot2:::rename_aes(modifyList(mapping, ...))  
    }
    
    ggplot(df, add_modify_aes(mapping, aes(color=new_col, y=new_y))) + geom_point(size=10)
    

    有一个处理aes冲突的轻微修改(即。, col , color , colour ).

    初始绘图: enter image description here 修改后的绘图: enter image description here

    推荐文章