这是最小的情况:
df <- data.frame(x=1:5, y=1, col=1:5)
mapping <- aes(x=x, y=y)
ggplot(df, mapping) + geom_point(size=10)
Run Code Online (Sandbox Code Playgroud)
现在我想为现有mapping对象添加(或覆盖)另一种美学(颜色).想要的情节是
ggplot(df, aes(x=x, y=y, colour=col)) + geom_point(size=10)
Run Code Online (Sandbox Code Playgroud)
我确信这有一个便利功能,但它没有在文档中列出,浏览源也没有帮助.我曾经偶然发现了类似的东西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)
Run Code Online (Sandbox Code Playgroud)
它适用于添加,但不适用于覆盖(不检查此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)
Run Code Online (Sandbox Code Playgroud)
col对于处理 aes 冲突(即、color、 ) ,有一个轻微的修改colour。
初始情节:
修改后的情节:
| 归档时间: |
|
| 查看次数: |
1770 次 |
| 最近记录: |