如何使用 R 中的 for 循环创建多个图,每个图具有不同的 y 轴标签和标题?
How can I create multiple plots, each with different y axis labels and titles using a for loop in R?
一些背景:我试图分析的数据是流式细胞术数据(对于那些不熟悉这是什么的人,就此 Q 而言,它基本上是使用激光表征不同的细胞类型)。我这里的变量是要绘制在 y 轴上的细胞的不同特征,每个变量都是从 "parent group." 中读取的,也就是说,如果感兴趣的变量是活细胞,parent 组可以是肾脏细胞,或肺细胞等
我有一个大数据 table,其中有 13 个变量需要绘制在同一个 x 轴上,即治疗后的时间(以周为单位)。我需要根据时间绘制的每个变量都需要一个不同的 y 轴标签和一个标题,其中应包括 both y 轴标签以及各自的名称 "parent group" 变量属于。我采取的步骤是:
- 将主数据table导入R
- 导入带有关键字的数据table,即每个变量名(即主数据table中的列名)及其各自的Y轴标签和"parent group"名称.例如,table 是这样的,
enter image description here
如您所知,"parent group" 名称或 y 轴标签不一定对每个变量名称都是唯一的
- 将关键字数据table的每一列分配给一个新向量,即变量、yaxis和parent.
- 创建一个 FOR 循环以自动从原始主数据 table 中提取数据,一次包含一个变量的信息,然后根据时间绘制它。
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 函数,但我不确定如何在此处应用这些函数。对此的任何帮助将不胜感激!
这是一种解释您的问题的方法:使用分面绘图并将 Parent
和 Yaxis
映射到分面标签中。这将产生一系列的刻面图,其中标签反映了 Parent
和 Yaxis
.
要进行分面,我们需要重塑数据框。
首先,调用库并创建一些有用的数据:
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_longer
从 tidyr
:
将数据重塑为长格式
data <- data %>%
pivot_longer(cols = -Week,
names_to = "vars",
values_to = "values")
然后我们使用 left_join
从映射 table 中引入数据,并使用基于 Parent
和 Yaxis
的构面标签创建一个新列:
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()
有了这个输出:
这不是您真正想要的,但希望对您有用。
一些背景:我试图分析的数据是流式细胞术数据(对于那些不熟悉这是什么的人,就此 Q 而言,它基本上是使用激光表征不同的细胞类型)。我这里的变量是要绘制在 y 轴上的细胞的不同特征,每个变量都是从 "parent group." 中读取的,也就是说,如果感兴趣的变量是活细胞,parent 组可以是肾脏细胞,或肺细胞等
我有一个大数据 table,其中有 13 个变量需要绘制在同一个 x 轴上,即治疗后的时间(以周为单位)。我需要根据时间绘制的每个变量都需要一个不同的 y 轴标签和一个标题,其中应包括 both y 轴标签以及各自的名称 "parent group" 变量属于。我采取的步骤是:
- 将主数据table导入R
- 导入带有关键字的数据table,即每个变量名(即主数据table中的列名)及其各自的Y轴标签和"parent group"名称.例如,table 是这样的,
enter image description here
如您所知,"parent group" 名称或 y 轴标签不一定对每个变量名称都是唯一的
- 将关键字数据table的每一列分配给一个新向量,即变量、yaxis和parent.
- 创建一个 FOR 循环以自动从原始主数据 table 中提取数据,一次包含一个变量的信息,然后根据时间绘制它。
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 函数,但我不确定如何在此处应用这些函数。对此的任何帮助将不胜感激!
这是一种解释您的问题的方法:使用分面绘图并将 Parent
和 Yaxis
映射到分面标签中。这将产生一系列的刻面图,其中标签反映了 Parent
和 Yaxis
.
要进行分面,我们需要重塑数据框。 首先,调用库并创建一些有用的数据:
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_longer
从 tidyr
:
data <- data %>%
pivot_longer(cols = -Week,
names_to = "vars",
values_to = "values")
然后我们使用 left_join
从映射 table 中引入数据,并使用基于 Parent
和 Yaxis
的构面标签创建一个新列:
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()
有了这个输出:
这不是您真正想要的,但希望对您有用。