在循环中使用 ggplot 中的粘贴函数
Use of paste function inside ggplot in a loop
问题:
我有三个数据框,"d1"、"d2" 和 "d3",具有三行 X1、X2 和值。我想使用 X2 作为索引将多条线绘制在一起。我想创建一个对每个数据帧执行相同操作的循环。该代码应适用于任何数据框。
我的代码
for (i in 1:3){
p<-as.name(paste("d", i, sep = ""))%>%
ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none")+
theme_classic2()
assign(paste("p", i, sep =""), p)
}
该函数在循环外工作,但是当我 运行 循环时我得到错误:
Error: `data` must be a data frame, or other object coercible by `fortify()`, not a character vector
我尝试时返回同样的错误:
for (i in 1:3){
p<- ggplot(as.name(paste("d", i, sep = "")), aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none")+
theme_classic2()
assign(paste("p", i, sep =""), p)
}
我在 SO 中找不到任何答案。
我认为这可能与循环内的 paste()
有关。
希望有人能提供帮助。
我不确定你在问什么,也不知道这条路线是否是解决问题的方法。如果您想绘制三个图,那么循环是一种方法。如果将 as.name
替换为 get
那么它应该可以工作:
d1 <- tibble(a = 1:10, b = 1:10)
d2 <- tibble(a = 10:1, b = 1:10)
d3 <- tibble(a = 5, b = 1:10)
for (i in 1:3){
p <- get(paste("d", i, sep = ""))%>%
ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none") +
theme_classic2()
assign(paste("p", i, sep =""), p)
}
另一种更简洁的方法是将数据帧组合成一个可迭代列表:
l <- list(d1, d2, d3)
for (i in 1:3){
p<-l[i][[1]]%>%
ggplot(aes(x=a, y=b))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none") +
theme_classic2()
assign(paste("p", i, sep =""), p)
}
这将遍历三个数据框并生成图表。我在这里用一个随机数据框进行了演示 - 如果这对您不起作用,那么最好 post 一个示例数据集以供进一步尝试和使用。
但是,如果你的目标是在一张图上绘制三条线,那么最好将它们组合成一个数据框,使用'X1` , 'X2' 和 'X3' 值作为分组列。但我不确定你的数据是什么样的来做到这一点。你能 post 样品吗?
问题: 我有三个数据框,"d1"、"d2" 和 "d3",具有三行 X1、X2 和值。我想使用 X2 作为索引将多条线绘制在一起。我想创建一个对每个数据帧执行相同操作的循环。该代码应适用于任何数据框。
我的代码
for (i in 1:3){
p<-as.name(paste("d", i, sep = ""))%>%
ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none")+
theme_classic2()
assign(paste("p", i, sep =""), p)
}
该函数在循环外工作,但是当我 运行 循环时我得到错误:
Error: `data` must be a data frame, or other object coercible by `fortify()`, not a character vector
我尝试时返回同样的错误:
for (i in 1:3){
p<- ggplot(as.name(paste("d", i, sep = "")), aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none")+
theme_classic2()
assign(paste("p", i, sep =""), p)
}
我在 SO 中找不到任何答案。
我认为这可能与循环内的 paste()
有关。
希望有人能提供帮助。
我不确定你在问什么,也不知道这条路线是否是解决问题的方法。如果您想绘制三个图,那么循环是一种方法。如果将 as.name
替换为 get
那么它应该可以工作:
d1 <- tibble(a = 1:10, b = 1:10)
d2 <- tibble(a = 10:1, b = 1:10)
d3 <- tibble(a = 5, b = 1:10)
for (i in 1:3){
p <- get(paste("d", i, sep = ""))%>%
ggplot(aes(x=X1, y=value, colour=as.factor(X2)))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none") +
theme_classic2()
assign(paste("p", i, sep =""), p)
}
另一种更简洁的方法是将数据帧组合成一个可迭代列表:
l <- list(d1, d2, d3)
for (i in 1:3){
p<-l[i][[1]]%>%
ggplot(aes(x=a, y=b))+
labs(title =paste("Plot", i, sep =" "), x = "X axis", y = "value")+
geom_line()+
theme(legend.position="none") +
theme_classic2()
assign(paste("p", i, sep =""), p)
}
这将遍历三个数据框并生成图表。我在这里用一个随机数据框进行了演示 - 如果这对您不起作用,那么最好 post 一个示例数据集以供进一步尝试和使用。
但是,如果你的目标是在一张图上绘制三条线,那么最好将它们组合成一个数据框,使用'X1` , 'X2' 和 'X3' 值作为分组列。但我不确定你的数据是什么样的来做到这一点。你能 post 样品吗?