2012-02-02 85 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