2012-02-02 87 views
11

我必須用相同的視圖生成250個圖。使用ggplot2在循環中創建圖

我的示例數據集中:

df <- data.frame(name = c("john","alex","mike","dennis","alex"), 
      expenses = c("10","12","15","8","2"), 
      type = c("food","rent","rent","food","food")) 

我想吧情節與費用在一個圖每一個名字。爲「亞歷克斯」的情節看起來像:

selected.name <- "alex" 
df1 <- subset(df, name == selected.name) 
ggplot(data = df1, aes(type, expenses)) + geom_bar() 

現在我想用一個循環,繪製在DF每一個名字相同的情節。我試圖使用運行上面劇情代碼的for循環作爲源文件。但我無法將名稱變量傳遞給源文件,以便爲每個名稱繪製圖形。現在我只能從for循環中獲得一張圖。

+0

請詳細說明您的問題。是你的問題,你只能得到1個窗口和1個圖表?比'x11()'可能是解決方案。如果你想保存PDF文件,然後使用'pdf(文件)''print(ggplot(...)''dev.off()'.... – Seb 2012-02-02 11:52:13

+0

Hi Seb,謝謝你的回覆。我爲名稱alex爲df中的所有其他名稱創建的圖表,而不需要手動輸入名稱,因爲在真實數據中有250個名稱,希望這有助於我的工作 – jeroen81 2012-02-02 11:58:16

+1

@Seb,我會選擇ggsave而不是pdf()。 – 2012-02-02 11:58:18

回答

15

回答你的原始問題。要做到這一點使用標準R:

doPlot = function(sel_name) { 
    dum = subset(df, name == sel_name) 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 

這樣你最終有大量的PDF文件稱爲Adam.pdf等。然後,您可以使用PDFTK(PDF工具包),以貓的文件一起在一個文件。我仍然更喜歡使用例如更好的解決方案。刻面或不同類型的情節。

使用facetting會不會更好?鑑於您的示例代碼將是:

ggplot(data = df, aes(type, expenses)) + 
    geom_bar() + facet_wrap(~name) 

這導致了以下情節:

enter image description here

也許對250名和更多的變數,這可能是一個問題。但是我仍然會考慮面向。

+0

感謝Paul,這是一個不錯的功能。它很方便地比較這些情節。 250個名稱和12個費用變量,這將產生一個非常複雜的情節,我正在構建一個報告工具,爲每個員工生成各種KPI,而且我們不會在本報告中進行比較,這就是爲什麼我需要所有個人情節。用Latex/R sweave生成的報告。 – jeroen81 2012-02-02 12:06:40

+1

我在單獨的pdf中添加了一個個別地塊的解決方案文件到我的答案。 – 2012-02-02 12:12:04

+0

謝謝保羅,這對我來說現在完美。我可以進一步滿足我的需求。 – jeroen81 2012-02-02 12:22:37

1

一個同事剛剛指出,在函數中使用子集是一個非常糟糕的主意。有關更多信息,請參見?subset()。所以我改編了保羅·赫姆斯特拉(Paul Hiemstra)的作品,並取而代之。

doPlot = function(sel_name) { 
    dum <- df[df$name == sel_name,] 
    ggobj = ggplot(data = dum, aes(type, expenses)) + geom_bar() 
    print(ggobj) 
    ggsave(sprintf("%s.pdf", sel_name)) 
} 
lapply(unique(df$name), doPlot) 
+0

+1!偉大的一點。子集 – marbel 2014-02-28 16:26:24