使用ggplot2在循环中创建图表

12

我需要生成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"))

我想要单个图表上显示每个名称的开销条形图。"alex"的图表将如下所示:

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

现在我想使用一个循环来为df中的每个名称绘制相同的图。我已经尝试使用for循环运行上面的绘图代码作为源文件。但是我无法将名称变量传递到源文件,以便为每个名称绘制图形。现在我只能从for循环中得到一个图。


请更具体地说明您的问题。您的问题是只得到一个窗口和一个图形吗?那么 x11() 可能是解决方案。如果您想保存为 PDF,则使用 pdf(file)print(ggplot(...))dev.off() - Seb
嗨Seb,感谢您的回复。我想创建一个与我为名称alex创建的绘图类似的绘图,适用于df中的每个其他名称,而无需手动输入名称。因为在真实数据中有250个名称。希望这可以帮助到您。 - jeroen81
1
@Seb,我会选择ggsave而不是pdf()。 - Paul Hiemstra
这个编程示例对你有帮助吗?链接 - baptiste
2个回答

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工具包)将这些文件拼接成一个文档。不过,我更喜欢使用更好的解决方案,例如facetting或不同类型的绘图。

使用facetting难道不是更好吗?根据您的示例,代码应该是:

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

这导致产生以下图表:

在此输入图片描述

也许对于250个名称和更多的变量,这可能是一个问题。但我仍然会考虑分面显示。


谢谢Paul,这是一个不错的功能。比较图很方便。在真实的数据框中有250个名称和12个费用变量。这将生成一个非常复杂的图。我正在构建一个报告工具,可以为每个员工生成各种KPI。我们在这份报告中不进行比较。这就是为什么我需要所有单独的图。报告是使用Latex/R sweave生成的。 - jeroen81
1
我在我的回答中添加了一个解决方案,其中包含单独的图形文件以PDF格式。 - Paul Hiemstra
谢谢Paul,这对我现在来说非常有效。我可以进一步调整函数以满足我的需求。 - jeroen81
1
关键是要使用print(ggobj)来获取绘图的副作用,否则将不会显示任何绘图。 - Yu Shen

2

一位同事指出,在函数中使用subset是一个非常糟糕的想法。请参阅?subset()获取更多信息。因此,我改编了Paul Hiemstra的答案,并替换了subset。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接