loops - 在循环中使用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()
循环内部有关。
希望有人可以提供帮助。
解决方案
我不确定你在问什么,以及这条路线是否是可行的方法。如果您要制作三个图,那么循环是一种方法。如果你替换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”值作为一个分组列。但我不确定你的数据是什么样子的。你可以发布一个样本吗?
推荐阅读
- geometry - 在两个屏幕之间变换点
- hyperledger-fabric - 如何在本地机器上运行 Hyperledger Fabric 网络?
- mysql - 字段列表中的列“”不明确
- javascript - 在 javascript 中使用模块模式获取未定义
- c# - 使用现有的 UserDb 在 .NetCore MVC 中实现新的 IdentityServer
- java - 如何为 org.apache.rahas.client.STSClient 添加受信任的证书,而不是在 JVM 级别更新信任库
- r - 按因子水平汇总并总计
- c++ - 如何创建“弱”功能并将其与对象一起使用?
- node.js - 当我查询 Alexa 可检索属性时如何解决“它不支持”
- c - 在 shm_open() 之后使用 fallocate() 会导致在 shm_unlink() 之后内存没有被释放