【问题标题】:Using a for loop with ggplot2 to plot multiple graphs within a data frame使用带有 ggplot2 的 for 循环在数据框中绘制多个图
【发布时间】:2018-05-25 13:04:17
【问题描述】:

只是想知道是否有人可以通过使用 ggplot2 的 for 循环来解决我在 R 中遇到的问题。我已经进行了一些聚类以找到随时间变化的数据模式。共有38种模式图,各种模式。聚类的输出是将所有 38 个图并排放置,这对于可视化非常有用。

但我想放大单个图形以放大它们以进行演示和清晰地查看模式。手动这很容易,但是,编写 38 个版本的相同脚本但每个版本中只有一个不同的集群非常乏味,所以我想创建一个 for 循环以便在一块快速代码中实现。我已经完成了这段代码(也有一些在线帮助),但是,我无法获得单独的 38 个图表的输出。代码本身可以工作,因为我可以指定一个集群,然后它会给我该特定集群的输出,但我想创建一个代码来创建所有 38 个不同的集群。

我使用的代码如下:

数据框称为 dfllgc,其中 dfllgc$cluster 包含有关各个集群的信息。我正在尝试的 for 循环如下但不起作用。任何帮助都将不胜感激!

    for(cluster in dfllgc$cluster){
  df<-subset(dataframAMIRllgc,cluster == 1:38)
  df$Time_point<-factor(df.s$Time_point, levels = c("p3", "p15", "p30","p60"))
  g<-ggplot(df, aes(x=Time_point, y=abundance, group=llgc, colour=llgc))+
  geom_line(size=1.5)+
  geom_point(size=4)+
  ggtitle("Cluster 29: Patterns over time (5 genes) \n") +
  xlab("\nAge") + ylab("Expression(CPM)\n")
  print(g) }

将 df

最后,对于标题 (ggtitle),有没有办法使标题也自动化,这样我就可以有一个模板,但簇号和基因数会自动应用于正确的簇?

非常感谢!任何帮助将不胜感激:)

示例数据

    merge   cluster Time_point  llgc    abundance
1   High[26-50%]p15 1   p15 High[26-50%]    166.5400335
38  High[26-50%]p3  1   p3  High[26-50%]    255.5007952
75  High[26-50%]p30 1   p30 High[26-50%]    122.1110473
112 High[26-50%]p60 1   p60 High[26-50%]    78.84340532
149 Low[0-10%]p15   1   p15 Low[0-10%]  86.40962037
186 Low[0-10%]p3    1   p3  Low[0-10%]  205.9750297
223 Low[0-10%]p30   1   p30 Low[0-10%]  60.23843127
260 Low[0-10%]p60   1   p60 Low[0-10%]  56.64259547
297 Medium[11-25%]p15   1   p15 Medium[11-25%]  165.2372227
334 Medium[11-25%]p3    1   p3  Medium[11-25%]  223.3891249
371 Medium[11-25%]p30   1   p30 Medium[11-25%]  155.1325448
408 Medium[11-25%]p60   1   p60 Medium[11-25%]  176.8285175
2   High[26-50%]p15 2   p15 High[26-50%]    85.21789981
39  High[26-50%]p3  2   p3  High[26-50%]    211.5359752
76  High[26-50%]p30 2   p30 High[26-50%]    35.7475454
113 High[26-50%]p60 2   p60 High[26-50%]    12.87995477
150 Low[0-10%]p15   2   p15 Low[0-10%]  77.20608808
187 Low[0-10%]p3    2   p3  Low[0-10%]  43.04550979
224 Low[0-10%]p30   2   p30 Low[0-10%]  34.88976766
261 Low[0-10%]p60   2   p60 Low[0-10%]  9.791146582
298 Medium[11-25%]p15   2   p15 Medium[11-25%]  46.21377697
335 Medium[11-25%]p3    2   p3  Medium[11-25%]  34.89603178
372 Medium[11-25%]p30   2   p30 Medium[11-25%]  14.18668175
409 Medium[11-25%]p60   2   p60 Medium[11-25%]  7.360330065
3   High[26-50%]p15 3   p15 High[26-50%]    47.75793997
40  High[26-50%]p3  3   p3  High[26-50%]    62.3529071
77  High[26-50%]p30 3   p30 High[26-50%]    17.8348889
114 High[26-50%]p60 3   p60 High[26-50%]    14.26366778
151 Low[0-10%]p15   3   p15 Low[0-10%]  138.1451371
188 Low[0-10%]p3    3   p3  Low[0-10%]  185.1184602
225 Low[0-10%]p30   3   p30 Low[0-10%]  63.52332626
262 Low[0-10%]p60   3   p60 Low[0-10%]  39.40566363
299 Medium[11-25%]p15   3   p15 Medium[11-25%]  26.32551336
336 Medium[11-25%]p3    3   p3  Medium[11-25%]  49.72067928
373 Medium[11-25%]p30   3   p30 Medium[11-25%]  8.288553629
410 Medium[11-25%]p60   3   p60 Medium[11-25%]  5.385031193

【问题讨论】:

  • 您可以使用cluster 列作为分组变量,用于自动生成不同的图。像这样的东西:www3.nd.edu/~steve/computing_with_data/13_Facets/facets.html。但是我们需要您的一些数据来帮助您。可能是来自 2-3 个不同集群的样本。
  • 在循环结束时调用ggsave,类似于ggsave(plot = g, file = paste0("plot_", cluster, ".png"))。您也可以使用paste 来构建您想要的任何标题字符串。
  • 大家好!非常感谢!尝试刻面无济于事,以及ggsave。没发生什么事 。我怀疑 for 循环不喜欢 df

标签: r loops for-loop ggplot2


【解决方案1】:

我不确定我 100% 了解您要做什么,但我认为您的子集有问题,然后您需要在末尾添加一个保存功能。希望这能满足您的要求:

dfllgc$Time_point<-factor(dfllgc$Time_point, levels = c("p3", "p15", "p30","p60"))

for(cluster in unique(dfllgc$cluster)) {

    g<-ggplot( dfllgc[ dfllgc$cluster == cluster, ], 
              aes(x=Time_point, y=abundance, group=llgc, colour=llgc)) +
        geom_line(size=1.5) +
        geom_point(size=4) +
        ggtitle( paste0("Cluster ", cluster,": Patterns over time (5 genes)") ) +
        xlab("Age") + ylab("Expression(CPM)")

    ggsave(paste0("Cluster_", cluster,".png"), g) 

}

所做的更改:

  • 删除了子集行并将集群子集/过滤器添加到ggplot 行,但它可以很容易地分开。
  • factor 转换移到 for 循环之外,因此只需应用一次。
  • 设置标题和文件名以随每个集群而变化

【讨论】:

  • 太棒了!!!非常感谢!是的,这绝对解决了问题!包括删除 ggsave 并在 R 中输出!快速提问,是否有类似于您的“cluster_”解决方案的功能,可以添加每个集群的基因数量,因为这也不同?会是 paste0("_genes") 吗?
  • 这取决于基因信息的来源。在您提供的表格中,我看不到任何看起来像许多基因的东西,但我真的不知道我在看什么。如果它在表中并且集群中的所有项目具有相同数量的基因,那么您可以执行以下操作:gene_no &lt;- dfllgc[ dfllgc$cluster == cluster, ]$genes[1] 选择基因数量并将其添加到paste0("Cluster ", cluster, ": Patterns over time (", gene_no, " genes)")。如果您将其添加到您的数据中,我会更新我的答案。
  • 很抱歉延迟回复,但感谢您的回复!会到处玩,试试这个,让你知道它是怎么回事!是的,正确的,除了那些仅仅属于一个特定集群的基因之外,没有关于每个集群的特定基因数量的单独信息。将尝试这个并回复你。再次感谢您的帮助!
  • 不幸的是,我无法从数据中得到正确的调用(如基因数量)。理论上,如果我添加属于集群 1 的基因数量,然后将其向量化,我应该使用 paste0 函数来调用每个集群的正确值...
  • 如果您有一个包含集群 ID 和基因数量的 data.frame,那么您可以将其合并到主 data.frame 或直接查找它。如果您的基因数表是:noGenes &lt;- data.frame(clusterNo = c(1,2,3), genes = c(5,7,3)。然后您可以使用:paste0("Cluster ", cluster, ": Patterns over time (", noGenes[clusterNo==cluster,"genes"], " genes)") 直接查找。如果您发布您的基因数据集数量,那么我可能会给出一个更确凿(和经过测试)的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2022-01-05
  • 2020-10-20
  • 1970-01-01
  • 2021-05-25
相关资源
最近更新 更多