首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用R中的for循环创建具有不同y轴标签和标题的多个图?

如何使用R中的for循环创建具有不同y轴标签和标题的多个图?
EN

Stack Overflow用户
提问于 2020-06-04 01:09:48
回答 1查看 729关注 0票数 0

一些背景:我试图分析的数据是流式细胞术数据(对于那些不熟悉这是什么的人来说,为了这个Q的目的,它基本上是用激光来描述不同的细胞类型)。这里的变量是在y轴上绘制的单元格的不同特性,每个变量都是从“父组”读取的。也就是说,如果感兴趣的变量是活细胞,则母体可以是肾细胞或肺细胞等。

我有一个大的数据表,有13个变量,需要在相同的x轴上绘制,即治疗后几周的时间。我需要针对时间绘制的每个变量,都需要一个不同的y轴标签和一个应该包括的标题----y轴标签以及变量所属的各自的“父组”的名称。我所采取的步骤是:

  1. 将主数据表导入R
  2. 导入一个带有关键字的数据表,即每个变量名(它们是主数据表中的列名)和相应的Y轴标签和“父组”名称。举个例子,这张表是什么样子的,

在这里输入图像描述

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

  1. 将关键字数据表的每一列分配给新的向量,即变量、yaxis和父变量。
  2. 创建一个FOR循环,自动从原始母版表中自动子集数据,每次包含一个变量的信息,然后根据时间绘制它。
代码语言:javascript
复制
    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轴标签和标题--当然,我被困在一个循环中,它继续运行,每个变量生成13y轴标签的组合*13个地块标题组合。我需要13个地块,每个地块都有自己的y轴标签和绘图标题,而不需要手动输入每个地块,因为我希望将这些地块作为jpeg文件直接从for循环导出。我考虑过使用if或if等函数,但我不知道如何在这里应用这些函数。任何帮助,这将是非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-04 02:29:03

这里有一个解释您的问题的方法:使用facet绘图并将ParentYaxis映射到facet标签中。这将导致一系列的面图,其中标签反映了ParentYaxis

要做面处理,我们需要重塑数据框架。首先,调用库并创建一些有用的数据:

代码语言:javascript
复制
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")
)

然后,我们使用来自pivot_longertidyr将数据重新格式化为长格式。

代码语言:javascript
复制
data <- data %>%
  pivot_longer(cols = -Week,
               names_to = "vars",
               values_to = "values")

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

代码语言:javascript
复制
data <- data %>%
  left_join(mapping, by= c("vars" = "variables")) %>%
  mutate(facet_labels = paste0(Parent, ": ", Yaxis))

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

代码语言:javascript
复制
ggplot(data = data, aes(x = Week, y = values)) +
  geom_point() +
  facet_wrap(.~ facet_labels, scales = "free") +
  theme_minimal()

有了这个输出:

这并不是你所要求的,但希望它对你有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62185211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档