如何为 lapply 循环中创建的 ggplots 分配唯一的标题和文本标签?
How to assign unique title and text labels to ggplots created in lapply loop?
我已经尝试了在 Stack Exchange 上找到的 for 循环和 lapply 循环的每一次迭代来创建 ggplots,这段代码对我来说效果很好。我唯一的问题是我无法分配唯一的标题和标签。据我所知,我在函数中采用了我的响应变量的值,因此我无法将我想要的标题作为标题字符串中的第 i 个条目进行索引。
我提供的示例创建了具有正确值的绘图,但绘图列表中的第二个和第三个绘图没有正确的标题或标签。
模拟数据集:
library(ggplot2)
nms=c("SampleA","SampleB","SampleC")
measr1=c(0.6,0.6,10)
measr2=c(0.6,10,0.8)
measr3=c(0.7,10,10)
qual1=c("U","U","")
qual2=c("U","","J")
qual3=c("J","","")
df=data.frame(nms,measr1,qual1,measr2,qual2,measr3,qual3,stringsAsFactors = FALSE)
识别数据集中包含响应变量的列
measrsindex=c(2,4,6)
创建图表列表以显示每次测量的所有样本
plotlist=list()
plotlist=lapply(df[,measrsindex], function(i) ggplot(df,aes_string(x="nms",y=i))+
geom_col()+
ggtitle("measr1")+
geom_text(aes(label=df$qual1)))
创建图表列表以显示每个样本的所有测量值
plotlist2=list()
plotlist2=lapply(df[,measrsindex],function(i)ggplot(df,aes_string(x=measrsindex, y=i))+
geom_col()+
ggtitle("SampleA")+
geom_text(aes(label=df$qual1)))
问题是我无法为每个绘图创建唯一的标题。(示例中的所有绘图都有标题 "measr1" 或“SampleA”)
此外 我不能为每个条应用唯一标签(来自质量列)。(例如,质量 2 的字母应该出现在每个样本的 measr2 列的顶部)
此外,在第二个绘图列表中,x-values 不是 "measr1"、"measr2"、"measr3" 它们是那些不是的列的索引值理想。
我是 R 的新手,之前从未在 Stack Overflow 上发帖,因此欢迎任何关于我的问题或发布问题的反馈。
我发现了很多关于此类主题的问题和答案,但 none 的数据结构或所需的情节与我的非常相似。如果这是一个多余的问题,我深表歉意,但我已尝试在以前的答案中找到解决方案,但一直找不到。
这是我获得制作循环的原始代码的地方,但是这个例子不包括标题或标签:
Looping over ggplot2 with columns
我建议在使用 ggplot2
之前将您的数据设置为长格式,这使得绘图任务变得更加简单。我还重新编码了一些变量以方便构建情节。下面是用 lapply
.
构建图的代码
library(tidyverse)
#Change from wide to long format
df1<-df %>%
pivot_longer(cols = -nms,
names_to = c(".value", "obs"),
names_sep = c("r","l")) %>%
#Separate Sample column into letters
separate(col = nms,
sep = "Sample",
into = c("fill","Sample"))
#Change measures index to 1-3
measrsindex=c(1,2,3)
plotlist=list()
plotlist=lapply(measrsindex, function(i){
#Subset by measrsindex (numbers) and plot
df1 %>%
filter(obs == i) %>%
ggplot(aes_string(x="Sample", y="meas", label="qua"))+
geom_col()+
labs(x = "Sample") +
ggtitle(paste("Measure",i, collapse = " "))+
geom_text()})
#Get the letters A : C
samplesvec<-unique(df1$Sample)
plotlist2=list()
plotlist2=lapply(samplesvec, function(i){
#Subset by samplesvec (letters) and plot
df1 %>%
filter(Sample == i) %>%
ggplot(aes_string(x="obs", y = "meas",label="qua"))+
geom_col()+
labs(x = "Measure") +
ggtitle(paste("Sample",i,collapse = ", "))+
geom_text()})
看着最后的情节,我觉得用facet_wrap
来制作这些情节可能会有用。我添加了代码以将其用于您的绘图。
#Plot for Measures
ggplot(df1, aes(x = Sample,
y = meas,
label = qua)) +
geom_col()+
facet_wrap(~ obs) +
ggtitle("Measures")+
labs(x="Samples")+
geom_text()
#Plot for Samples
ggplot(df1, aes(x = obs,
y = meas,
label = qua)) +
geom_col()+
facet_wrap(~ Sample) +
ggtitle("Samples")+
labs(x="Measures")+
geom_text()
这是使用 facet_wrap
的绘图示例。
您可以遍历列的名称而不是列本身,然后使用一些非标准评估从名称中获取列值。另外,我在 aes
.
中包含了标签
library(ggplot2)
library(rlang)
plotlist3 <- purrr::map(names(df)[measrsindex],
~ggplot(df, aes(nms, !!sym(.x), label = qual1)) +
geom_col() + ggtitle(.x) + geom_text(vjust = -1))
plotlist3[[1]]
plotlist3[[2]]
同样可以用lapply
实现
plotlist4 <- lapply(names(df)[measrsindex], function(x)
ggplot(df, aes(nms, !!sym(x), label = qual1)) +
geom_col() + ggtitle(x) + geom_text(vjust = -1))
我已经尝试了在 Stack Exchange 上找到的 for 循环和 lapply 循环的每一次迭代来创建 ggplots,这段代码对我来说效果很好。我唯一的问题是我无法分配唯一的标题和标签。据我所知,我在函数中采用了我的响应变量的值,因此我无法将我想要的标题作为标题字符串中的第 i 个条目进行索引。
我提供的示例创建了具有正确值的绘图,但绘图列表中的第二个和第三个绘图没有正确的标题或标签。
模拟数据集:
library(ggplot2)
nms=c("SampleA","SampleB","SampleC")
measr1=c(0.6,0.6,10)
measr2=c(0.6,10,0.8)
measr3=c(0.7,10,10)
qual1=c("U","U","")
qual2=c("U","","J")
qual3=c("J","","")
df=data.frame(nms,measr1,qual1,measr2,qual2,measr3,qual3,stringsAsFactors = FALSE)
识别数据集中包含响应变量的列
measrsindex=c(2,4,6)
创建图表列表以显示每次测量的所有样本
plotlist=list()
plotlist=lapply(df[,measrsindex], function(i) ggplot(df,aes_string(x="nms",y=i))+
geom_col()+
ggtitle("measr1")+
geom_text(aes(label=df$qual1)))
创建图表列表以显示每个样本的所有测量值
plotlist2=list()
plotlist2=lapply(df[,measrsindex],function(i)ggplot(df,aes_string(x=measrsindex, y=i))+
geom_col()+
ggtitle("SampleA")+
geom_text(aes(label=df$qual1)))
问题是我无法为每个绘图创建唯一的标题。(示例中的所有绘图都有标题 "measr1" 或“SampleA”)
此外 我不能为每个条应用唯一标签(来自质量列)。(例如,质量 2 的字母应该出现在每个样本的 measr2 列的顶部)
此外,在第二个绘图列表中,x-values 不是 "measr1"、"measr2"、"measr3" 它们是那些不是的列的索引值理想。
我是 R 的新手,之前从未在 Stack Overflow 上发帖,因此欢迎任何关于我的问题或发布问题的反馈。
我发现了很多关于此类主题的问题和答案,但 none 的数据结构或所需的情节与我的非常相似。如果这是一个多余的问题,我深表歉意,但我已尝试在以前的答案中找到解决方案,但一直找不到。
这是我获得制作循环的原始代码的地方,但是这个例子不包括标题或标签: Looping over ggplot2 with columns
我建议在使用 ggplot2
之前将您的数据设置为长格式,这使得绘图任务变得更加简单。我还重新编码了一些变量以方便构建情节。下面是用 lapply
.
library(tidyverse)
#Change from wide to long format
df1<-df %>%
pivot_longer(cols = -nms,
names_to = c(".value", "obs"),
names_sep = c("r","l")) %>%
#Separate Sample column into letters
separate(col = nms,
sep = "Sample",
into = c("fill","Sample"))
#Change measures index to 1-3
measrsindex=c(1,2,3)
plotlist=list()
plotlist=lapply(measrsindex, function(i){
#Subset by measrsindex (numbers) and plot
df1 %>%
filter(obs == i) %>%
ggplot(aes_string(x="Sample", y="meas", label="qua"))+
geom_col()+
labs(x = "Sample") +
ggtitle(paste("Measure",i, collapse = " "))+
geom_text()})
#Get the letters A : C
samplesvec<-unique(df1$Sample)
plotlist2=list()
plotlist2=lapply(samplesvec, function(i){
#Subset by samplesvec (letters) and plot
df1 %>%
filter(Sample == i) %>%
ggplot(aes_string(x="obs", y = "meas",label="qua"))+
geom_col()+
labs(x = "Measure") +
ggtitle(paste("Sample",i,collapse = ", "))+
geom_text()})
看着最后的情节,我觉得用facet_wrap
来制作这些情节可能会有用。我添加了代码以将其用于您的绘图。
#Plot for Measures
ggplot(df1, aes(x = Sample,
y = meas,
label = qua)) +
geom_col()+
facet_wrap(~ obs) +
ggtitle("Measures")+
labs(x="Samples")+
geom_text()
#Plot for Samples
ggplot(df1, aes(x = obs,
y = meas,
label = qua)) +
geom_col()+
facet_wrap(~ Sample) +
ggtitle("Samples")+
labs(x="Measures")+
geom_text()
这是使用 facet_wrap
的绘图示例。
您可以遍历列的名称而不是列本身,然后使用一些非标准评估从名称中获取列值。另外,我在 aes
.
library(ggplot2)
library(rlang)
plotlist3 <- purrr::map(names(df)[measrsindex],
~ggplot(df, aes(nms, !!sym(.x), label = qual1)) +
geom_col() + ggtitle(.x) + geom_text(vjust = -1))
plotlist3[[1]]
plotlist3[[2]]
同样可以用lapply
实现
plotlist4 <- lapply(names(df)[measrsindex], function(x)
ggplot(df, aes(nms, !!sym(x), label = qual1)) +
geom_col() + ggtitle(x) + geom_text(vjust = -1))