首页 > 解决方案 > 在循环中使用ggplot内的粘贴函数

问题描述

问题:我有三个数据框,“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()循环内部有关。

希望有人可以提供帮助。

标签: loopsggplot2paste

解决方案


我不确定你在问什么,以及这条路线是否是可行的方法。如果您要制作三个图,那么循环是一种方法。如果你替换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)
}

这将遍历三个数据框并生成图表。我在这里演示了一个随机数据框 - 如果这对您不起作用,那么最好发布一个示例数据集以获取更多答案以尝试使用。

但是,如果您的目标是在一个图表上绘制三条线,那么最好将它们组合成一个数据框,并将“X1”、“X2”和“X3”值作为一个分组列。但我不确定你的数据是什么样子的。你可以发布一个样本吗?


推荐阅读