在现有映射对象中添加或覆盖aes
这是最小的情况:
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
类的AddOrOverrideAes
,但不知道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
定制,看到这个问题。
编辑:
工作流程如下:获取现有mapping
作为参数,对其进行修改并进一步传递给另一个函数。 我无法修改“最终”ggplot调用。
根据@ 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
)。
初始情节: 修改情节:
链接地址: http://www.djcxy.com/p/30855.html上一篇: Add or override aes in the existing mapping object
下一篇: How to produce a meaningful draftsman/correlation plot for discrete values