2012-03-02 62 views
5

我正在繪製大量類似的圖,所以我想我編寫一個函數來簡化任務。我想通過它data.frame和要繪製的列的名稱。這是我曾嘗試:如何將列名傳遞給處理數據的函數。框架

plot_individual_subjects <- function(var, data) 
{ 
    require(ggplot2) 

    ggplot(data, aes(x=Time, y=var, group=Subject, colour=SubjectID)) + 
    geom_line() + geom_point() + 
    geom_text(aes(label=Subject), hjust=0, vjust=0) 
} 

現在,如果var是行不通的字符串。如果將ggplot命令的aes部分更改爲y=data[,var],它也不起作用,它會抱怨無法對閉包進行子集化。

那麼解決這個問題和類似問題的正確方法/最佳實踐是什麼?如何將列名輕鬆安全地傳遞給想要對data.frames進行處理的函數?

+2

改爲使用'aes_string'。 – joran 2012-03-02 18:08:33

+1

@joran你不妨發佈一個答案。 – Justin 2012-03-02 18:12:11

回答

10

壞的喬蘭,回答評論!

您想使用aes_string,它允許您將變量名稱作爲字符串傳遞。在你的特定情況下,因爲你似乎只想修改y變量,所以你可能想重新組織哪些美學映射到哪些geoms中。例如,可能是這樣的:

ggplot(data, aes_string(y = var)) + 
    geom_line(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_point(aes(x = Time,group = Subject,colour = SubjectID)) + 
    geom_text(aes(x = Time,group = Subject,colour = SubjectID,label = Subject),hjust =0,vjust = 0) 

或者也許是相反的方式,這取決於你的口味。

+0

喬蘭,有沒有辦法在同一個ggplot調用中混合aes()和aes_string()?也就是說,如果我的x軸對於所有的幾何都是一樣的,把它放在幾何圖形調用中似乎有點笨拙 – KarateSnowMachine 2012-08-21 04:02:45

+2

@KarateSnowMachine你不能在同一圖層中同時使用'aes'和'aes_string'。你總是可以在'aes_string'中將它映射爲'x ='Time''等。 – joran 2012-08-21 13:07:18

+0

謝謝,我沒有意識到這很容易。 – KarateSnowMachine 2012-08-22 03:44:43

相關問題