首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ggplot2:在循环中添加线条并保留颜色映射

ggplot2:在循环中添加线条并保留颜色映射
EN

Stack Overflow用户
提问于 2015-09-21 15:06:51
回答 1查看 6.8K关注 0票数 1

在运行以下两段代码时,我意外地得到了不同的结果。我需要在循环中添加线条,就像在EX2中一样,但是所有的线条最终都有相同的颜色。为什么会这样呢?

EX1

代码语言:javascript
复制
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

代码语言:javascript
复制
#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)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-21 16:09:39

这不是一种很好的使用ggplot的方法。试着这样做:

代码语言:javascript
复制
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=...参数,因此您可以执行如下操作:

代码语言:javascript
复制
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的错误方式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32698616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档