使用ggplot2在循环中创建绘图

时间:2012-02-02 11:37:05

标签: r ggplot2

我必须生成250个具有相同视图的图。

我的示例数据集:

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

我想在单个地块中为每个名字的费用添加条形图。 &#34; alex&#34;的情节看起来像是:

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

现在我想使用一个循环,为df中的每个名字绘制相同的图。我试图使用一个for循环来运行上面的绘图代码作为源文件。但是我无法将name变量传递给源文件,因此它会为每个名称绘制图形。现在我只从for循环中得到一个图形。

2 个答案:

答案 0 :(得分: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)

通过这种方式,您最终得到了大量名为Adam.pdf等的pdf文件。然后,您可以使用pdftk(pdf工具包)将文件合并到一个文档中。我仍然更喜欢使用例如更好的解决方案。切面或不同类型的情节。

使用刻面不是更好吗?鉴于您的示例,代码将是:

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

导致以下情节:

enter image description here

对于250个名字和更多变量,这可能是一个问题。但是,我仍然要考虑切面。

答案 1 :(得分:2)

一位同事刚刚指出在函数中使用子集是一个非常糟糕的主意。有关详细信息,请参阅?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)