我必须生成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循环中得到一个图形。
答案 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)
导致以下情节:
对于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)