在现有映射对象中添加或覆盖aes

时间:2014-02-13 08:16:46

标签: r ggplot2 ggally

这是最小的案例:

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.

修改:

工作流程如下:将现有mapping作为参数进行修改,并将其进一步传递给另一个函数。我无法修改“最终”ggplot调用。

1 个答案:

答案 0 :(得分:3)

基于@ 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碰撞进行了轻微修改(即colcolorcolour)。

初始情节:enter image description here 修改后的情节:enter image description here