ggplot用于从for循环中的数据框中提取行,显示不同的颜色

时间:2015-05-01 17:16:11

标签: r for-loop colors ggplot2 legend

我有一个包含月度时间序列数据的数据框(从2010年1月到2012年12月)。

    df<- data.frame(code=NA,Year=NA,Month=rep(seq(as.Date('2010/1/1'),by='month',length.out=36),3),x1=rnorm(3*36))
    df$code[1:36]<-1; df$code[37:72]<-2; df$code[73:108]<-3
    yr <- c(rep(2010,12),rep(2011,12),rep(2012,12))
    df$Year<-rep(yr,3)

我想提取具有相同代码的行(每个代码将有36行),并将每个代码的值绘制在彼此之上。我尝试通过以下代码实现此目的:

    m <- ggplot(df[1:36,], aes(x=Month,y=x1)) + geom_point() + geom_line(aes(color ='ID:1')) + 
    scale_x_date(labels = date_formatv(format = "%m"),breaks = date_breaks("month"))+ 
    xlab("") + ylab("")+ facet_wrap(~Year,scales=("free_x"))

现在我写了一个for循环来提取接下来的36个观察并将它们添加到图中:

    for(i in 1:2){
      data2 <- df[((i*36)+1):((i+1)*36),]
      m<-m+geom_point(data=data2,aes(x=Month,y=x1))+geom_line(data=data2,aes(x=Month,y=x1
                                                                               ,color=paste0('ID:',i+1)))
   }

此代码生成以下图表:

enter image description here

现在我的问题是:

(1)正如你所看到的,我没有获得ID:2的传奇(它只生成最后一个的传奇),我该怎么做?

(2)我希望每个代码看到不同的颜色(与图例相关联),我该如何实现?

(3)我确信应该有更好的方法来产生所需的输出,而不是使用for循环,这是不推荐的任何建议?

2 个答案:

答案 0 :(得分:1)

code映射到coloraes语句。

m <- ggplot(df, aes(x=Month,y=x1,color=factor(code))) + 
  geom_point() + 
  geom_line() + 
  scale_x_date(labels = date_format(format = "%m"),breaks = date_breaks("month"))+ 
  xlab("") + ylab("")+ facet_wrap(~Year,scales=("free_x"))
m

答案 1 :(得分:1)

不是使用for循环或子集,而是将color = factor(code)添加到您的美学中,这将为每组36添加单独的彩色线条(和点):

m <- ggplot(df, aes(x=Month, y=x1, color = factor(code))) +
    geom_point() + geom_line() + 
    scale_x_date(labels = date_format(format = "%m"),breaks = date_breaks("month"))+ 
    xlab("") + ylab("")+ facet_wrap(~Year,scales=("free_x"))

print(m)

enter image description here

(您可以使用labs(color = "ID")自然地自定义标签标题,或使用scale_color_manual自定义颜色选择。