2014-02-13 21 views
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調用。

+3

爲什麼不只是'ggplot(DF,映射)+ geom_point(大小= 10)+ AES(顏色= COL)'? –

+0

感謝您的提示,我不知道這是可能的!但是,我需要將修改後的映射進一步傳遞給另一個函數,所以我不能直接修改最終的ggplot調用。 – tonytonov

+1

aes is list so ggplot(df,modifyList(mapping,aes(color = col)))+ geom_point(size = 10)'作品。 – kohske

回答

2

基於@ 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