【问题标题】:Create plots in a loop using ggplot2使用 ggplot2 在循环中创建绘图
【发布时间】:2012-02-02 11:37:05
【问题描述】:

我必须生成 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 循环将上面的绘图代码作为源文件运行。但是我不能将 name 变量传递给源文件,以便它为每个名称绘制图形。现在我只能从 for 循环中得到一张图。

【问题讨论】:

  • 请详细说明您的问题。你的问题是你只有 1 个窗口和 1 个图形吗?比x11() 可能是解决方案。如果您想保存 pdf,请使用 pdf(file) print(ggplot(...) dev.off()....
  • 嗨,Seb,感谢您的回复。我想创建一个图,就像我为 df 中的每个其他名称的名称 alex 创建的图一样。无需手动输入名称。因为在真实数据中有 250 个名字。希望这会有所帮助。
  • @Seb,我会选择 ggsave 而不是 pdf()。
  • this example 有帮助吗?

标签: r ggplot2


【解决方案1】:

回答您的原始问题。使用标准 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 个名称和更多变量,这可能是个问题。但我还是会考虑刻面。

【讨论】:

  • 感谢 Paul,这是一个不错的功能。比较地块很方便。在真实的 df 中有 250 个名称和 12 个费用变量。这将产生一个非常复杂的情节。我正在构建一个报告工具,可以为每位员工生成各种 KPI。我们不会在本报告中进行比较。这就是为什么我需要所有单独的情节。使用 Latex/R sweave 生成​​的报告。
  • 我在我的答案中添加了一个解决方案,其中包含单独的 pdf 文件中的各个图。
  • 感谢 Paul,这对我来说非常适合。我可以根据自己的需要进一步完善这些功能。
  • 关键是要有 print(ggobj) 才能得到 plot 显示的副作用,否则就没有 plot 显示了。
【解决方案2】:

一位同事刚刚指出,在函数中使用子集是一个非常糟糕的主意。请参阅?subset() 了解更多信息。所以我改编了 Paul Hiemstra 的 anwser 并替换了子集。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    相关资源
    最近更新 更多