在运行以下两段代码时,我意外地得到了不同的结果。我需要在循环中添加线条,就像在EX2中一样,但是所有的线条最终都有相同的颜色。为什么会这样呢?
EX1
economics2 <- economics
economics2$unemploy <- economics$unemploy + 1000
economics3 <- economics
economics3$unemploy <- economics$unemploy + 2000
economics4 <- economics
economics4$unemploy <- economics$unemploy + 3000
b <- ggplot() +
geom_line(aes(x = date, y = unemploy, colour = as.character(1)), data=economics2) +
geom_line(aes(x = date, y = unemploy, colour = as.character(2)), data=economics3) +
geom_line(aes(x = date, y = unemploy, colour = as.character(3)), data=economics4)
print(b)

EX2
#economics2, economics3, economics4 are reused from EX1.
b <- ggplot()
econ <- list(economics2, economics3, economics4)
for(i in 1:3){
b <- b + geom_line(aes(x = date, y = unemploy, colour = as.character(i)), data=econ[[i]])
}
print(b)

发布于 2015-09-21 16:09:39
这不是一种很好的使用ggplot的方法。试着这样做:
econ <- list(e1=economics2, e2=economics3, e3=economics4)
df <- cbind(cat=rep(names(econ),sapply(econ,nrow)),do.call(rbind,econ))
ggplot(df, aes(date,unemploy, color=cat)) + geom_line()

这将您的三个版本的economics放在一个长格式的data.frame中(1列中的所有数据,本例中的第二列cat,标识源)。一旦您这样做了,ggplot就会处理其他的事情。没有循环。
正如注释中指出的那样,循环失败的具体原因是,使用aes(...)将表达式存储在ggplot对象中,并且在调用print(...)时对该表达式进行计算。此时i是3。
请注意,这不适用于data=...参数,因此您可以执行如下操作:
b=ggplot()
for(i in 1:3){
b <- b + geom_line(aes(x=date,y=unemploy,colour=cat),
data=cbind(cat=as.character(i),econ[[i]]))
}
print(b)

但是,这仍然是使用ggplot的错误方式。
https://stackoverflow.com/questions/32698616
复制相似问题