7
這裏是最小的情況下:在現有映射對象添加或替代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
之類的東西,但不知道究竟在哪裏。
這裏是我目前的解決辦法是什麼:
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,映射)+ geom_point(大小= 10)+ AES(顏色= COL)'? –
感謝您的提示,我不知道這是可能的!但是,我需要將修改後的映射進一步傳遞給另一個函數,所以我不能直接修改最終的ggplot調用。 – tonytonov
aes is list so ggplot(df,modifyList(mapping,aes(color = col)))+ geom_point(size = 10)'作品。 – kohske