【发布时间】:2014-02-13 08:16:46
【问题描述】:
这是最小的情况:
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 调用。
【问题讨论】:
-
为什么不只是
ggplot(df, mapping) + geom_point(size=10) + aes(colour=col)? -
感谢您的注意,我不知道这是可能的!但是,我需要将修改后的映射进一步传递给另一个函数,所以我不能直接修改最终的 ggplot 调用。
-
aes 是列表,所以
ggplot(df, modifyList(mapping, aes(colour=col))) + geom_point(size=10)有效。 -
感谢您的评论,这似乎是我正在寻找的。你会发布这个作为答案还是我应该自己做这个?
-
@tonytonov 今天已经过去了,所以请随时自己发布答案。