【问题标题】:How can I create multiple plots, each with different y axis labels and titles using a for loop in R?如何使用 R 中的 for 循环创建多个图,每个图都有不同的 y 轴标签和标题?
【发布时间】:2020-09-22 21:09:44
【问题描述】:

一些背景:我试图分析的数据是流式细胞仪数据(对于那些不熟悉这是什么的人,为了这个 Q 的目的,它基本上是使用激光来表征不同的细胞类型)。我在这里的变量是要在 y 轴上绘制的单元格的不同特征,并且每个变量都是从“父组”中读取的。也就是说,如果感兴趣的变量是Live Cells,则父组可以是Kidney cells,或者Lung cells等。

我有一个包含 13 个变量的大型数据表,需要针对相同的 x 轴(即治疗后的时间(以周为单位))进行绘制。我需要针对时间绘制的每个变量都需要一个不同的 y 轴标签和一个标题,该标题应包括 both y 轴标签以及变量所属的相应“父组”的名称到。我采取的步骤是:

  1. 将主数据表导入R
  2. 使用关键字导入数据表,即每个变量名称(即主数据表中的列名称)以及其各自的 Y 轴标签和“父组”名称。例如,这张桌子是这样的,

enter image description here

如您所知,“父组”名称或 y 轴标签不一定对每个变量名称都是唯一的

  1. 将关键字数据表的每一列分配给一个新向量,即变量、yaxis 和 parent。
  2. 创建一个 FOR 循环,以自动从包含一个变量信息的原始主表中提取数据子集,然后将其与时间进行对比。
    r 
   for(i in variables){
    table<-as.data.frame(test[,c("WEEK",i)])`
    for(j in yaxis){
    for (k in parent){
    plot<-ggplot(table,aes(x=WEEK,y=table[,3]))+geom_line()+geom_point(size=2)+scale_shape_manual(values=1:25)+xlab("Weeks")+ylab(j)+theme_minimal()+ggtitle(paste0(k,"-",j))
ggsave(plot,file=paste0(paste(j,k,sep="_"),"plot.jpg"),width=14,height=10,units="cm")
     }
      }
      rm(table)
      rm(plot)
    }

我在这里尝试做的是自动化 for 循环,为每个变量添加各自的 y 轴标签和标题,但我当然陷入了一个循环,它继续运行并生成,每个变量的组合13 个 y 轴标签 * 13 个绘图标题组合。我需要 13 个绘图,每个绘图都有自己的 y 轴标签和绘图标题,而无需为每个绘图手动输入,因为我希望将绘图直接从 for 循环导出为 jpeg 文件。我考虑过使用 if 或 if else 函数,但我不确定如何在此处应用这些函数。对此的任何帮助将不胜感激!

【问题讨论】:

    标签: r loops ggplot2 plot nested-loops


    【解决方案1】:

    这是一种解释您的问题的方法:使用构面绘图并将ParentYaxis 映射到构面标签中。这将产生一系列刻面图,其中标签反映了ParentYaxis

    要进行分面,我们需要重塑数据框。 首先,调用库并创建一些有用的数据:

    library(dplyr)
    library(tidyr)
    library(tibble)
    library(ggplot2)
    
    # make fake data
    data <- tibble(
      Week = seq(from = 1, length.out = 91),
      cells_live = runif(min = 1, max = 10, n = 91),
      cells_live_dividing = runif(min = 1, max = 10, n = 91),
      cells_live_aging = runif(min = 1, max = 10, n = 91)
    )
    
    mapping <- tibble(
      variables = c("cells_live", "cells_live_dividing", "cells_live_aging"),
      Parent = c("COUNT", "live", "live"),
      Yaxis = c("live cells", "divinding cells", "aging")
    )
    

    然后我们使用来自tidyrpivot_longer 将数据重新整形为长格式:

    data <- data %>%
      pivot_longer(cols = -Week,
                   names_to = "vars",
                   values_to = "values")
    

    然后,我们从带有left_join 的映射表中引入数据,并使用基于ParentYaxis 的构面标签创建一个新列:

    data <- data %>%
      left_join(mapping, by= c("vars" = "variables")) %>%
      mutate(facet_labels = paste0(Parent, ": ", Yaxis))
    

    最后,我们调用ggplot,使用facet_labels作为分面变量:

    ggplot(data = data, aes(x = Week, y = values)) +
      geom_point() +
      facet_wrap(.~ facet_labels, scales = "free") +
      theme_minimal()
    

    有了这个输出:

    这并不完全符合您的要求,但希望它对您有用。

    【讨论】:

      猜你喜欢
      • 2020-01-21
      • 2019-05-30
      • 2023-03-05
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2020-06-26
      相关资源
      最近更新 更多