我有一个包含月度时间序列数据的数据框(从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)))
}
此代码生成以下图表:
现在我的问题是:
(1)正如你所看到的,我没有获得ID:2的传奇(它只生成最后一个的传奇),我该怎么做?
(2)我希望每个代码看到不同的颜色(与图例相关联),我该如何实现?
(3)我确信应该有更好的方法来产生所需的输出,而不是使用for循环,这是不推荐的任何建议?
答案 0 :(得分:1)
将code
映射到color
到aes
语句。
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)
(您可以使用labs(color = "ID")
自然地自定义标签标题,或使用scale_color_manual
自定义颜色选择。