【问题标题】:Print multiple ggplots for each factor using a for loop in R使用 R 中的 for 循环为每个因子打印多个 ggplots
【发布时间】:2015-03-22 11:36:36
【问题描述】:

我对 R 很陌生,这是我在 Stackoverflow 上的第一个问题,所以如果有任何不清楚的地方请告诉我!
我有一个由因子变量 df$site 分割的大型数据集。 对于每个站点,我需要打印几个图(比如 A 和 B)。到目前为止,我已经设法将所有图单独打印为单独的 PDF 文件(使用下面的代码)。
但是,我需要将绘图分组到一个大 PDF 中 - 其中每个页面都包含每个站点的绘图 A 和绘图 B,例如
第 1 页 - 站点 1 - 地块 A1,地块 B1
第 2 页 - 站点 2 - 地块 A2、地块 B2(等等)。
我将非常感谢有关如何执行此操作的一些建议!

doplot = invisible(by(df, df$site, function(i) {

A <- ggplot(i, aes(x, y1))+ geom_point() + ggtitle(unique(i$site))  
B <- ggplot(i, aes(x, y2))+ geom_point() + ggtitle(unique(i$site))

ggsave(sprintf("%s_A.pdf", unique(i$site)), A)
ggsave(sprintf("%s_B.pdf", unique(i$site)), B)
}))

lapply(unique(df$site), doplot)

我不知道如何发布示例数据,所以这里是一个简化的示例:

site    x   y1  y2
site_1  3.56    0.337674318 1.935941597
site_1  4.31    1.559665628 2.402924583
site_1  4.36    1.523297984 2.600534832
site_1  5.03    2.261701756 2.394485714
site_1  5.23    2.573428703 2.686396123
site_1  5.33    2.582030907 2.600534832
site_1  5.69    2.842581635 2.723667517
site_2  3.79    2.793543915 3.265708161
site_2  4.49    3.353407259 3.701443333
site_2  4.88    3.363259555 3.733048672
site_2  4.94    3.550471097 3.780780075
site_2  4.88    3.590317006 3.848359519
site_2  5.31    3.708100041 3.922750337
site_2  5.26    3.735499016 3.906067837
site_2  4.22    3.074269438 4.091499816
site_2  6.72    4.329273722 4.35481919
site_2  6.46    4.283464186 4.326989203

我已经上传了一个示例 .csv 文件 here。 谢谢!

【问题讨论】:

  • 你能输入你的data.frame吗?

标签: r for-loop ggplot2


【解决方案1】:

您可以使用ggplot2 facetting 将所有图放在同一页面上:

ggplot(df, aes(x=x, y=y1)) +
  geom_point() + 
  facet_grid(. ~ site)

【讨论】:

  • 谢谢...但我的问题是如何按站点对 不同 图(x-y1 和 x-y2)进行分组..
  • @Louise,我认为您应该将绘图代码包含在 pdf - function 中并使用“onefile”参数。 This answer 也可能有帮助。
  • @hvollmeier:我试过了,但仍然没有找到可以正常工作的解决方案。当我找到一个时,我会在这里发布一个......
【解决方案2】:

@Luise,使用您的“sample.csv”文件,这将为您提供所要求的文件,每页 2 个图,按“站点”分组。 (确保变量 'site' 是一个因素。你应该用 'str(df)' 检查它)。我使用 'grid.Extra' 包中的 'grid.arrange' 函数来放置绘图。如果 pdf 函数中没有名称参数,则绘图将打印到默认的“Rplots.pdf”文件中。

require(ggplot2)
require(gridExtra)
pdf(onefile = TRUE)
for(i in 1:length(levels(df$site))){
  A <- ggplot(df[df$site == levels(df$site)[i],], aes(x=x, y=y1)) + geom_point() + ggtitle(levels(df$site)[i])
  B <- ggplot(df[df$site == levels(df$site)[i],], aes(x=x, y=y2)) + geom_point() + ggtitle(levels(df$site)[i])
  grid.arrange(A, B)
}
dev.off()

您可以下载输出文件here

【讨论】:

  • 非常感谢!!这正是我需要产生的输出。我在我的完整数据集上尝试了代码,它运行良好 - 所以我非常感谢你:)
猜你喜欢
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-06
  • 2012-08-27
相关资源
最近更新 更多