【问题标题】:R ggplot timeseries plot, single line, color by factorR ggplot时间序列图,单线,按因子颜色
【发布时间】:2018-07-10 07:18:55
【问题描述】:

我有一些时间序列数据的工作图。在三年的时间里,我有一个值得策划的地方。看着情节,我想把每一年都画成不同的颜色。在我的 data.frame 中,我创建了一个年因子。我怎样才能用它来改变颜色?

 head(wf)
       Date Year Gals Days  GpD    GpM
 2016-10-21 2016  6.0    1  6.0  186.0
 2016-10-22 2016  6.0    1  6.0  186.0
 2016-10-23 2016 12.4    1 12.4  384.4
 2016-10-24 2016 26.8    1 26.8  830.8
 2016-10-25 2016 33.3    1 33.3 1032.3
 2016-10-26 2016 28.3    1 28.3  877.3
 nrow(wf)   626

这是我的代码的基础,适用于单一颜色...

  myscat<-ggplot(wf, aes(x=Date, y=Gals)) +
  scale_x_date(date_labels="%b-%y", date_breaks="1 month",expand=c(0,0),  position = "top") +
  geom_line(aes(lty = "Gals", color = "Gals")) +
  geom_hline(aes(yintercept = mean(wf$Gals), linetype = "Mean", color = "Mean"), size=1) +
  geom_hline(aes(yintercept = median(wf$Gals), linetype = "Median", color = "Median"), size = 1) +
  scale_linetype('Water Usage', labels = labels) +
  scale_color_manual('Water Usage', values=c('Gals'='dodgerblue2', 'Mean'='red', 'Median'='orange'),
                 labels = labels) +
  scale_y_continuous(breaks=c(0,5,10,15,20,25,30,40,50,60,70,80,90,100), 
                minor_breaks =seq(5,10,5), limits=c(0,100),expand=c(0,0)) +
  ggtitle( "Daily Water Usage", subtitle=subtext )+
  xlab("") + ylab("Gallons per Day") + #labs(title="Daily Water Usage") + 
  theme(plot.title = element_text(hjust=0.5),   plot.subtitle=element_text(family="Comic Sans MS")) +
  theme(legend.box.background = element_rect(),   legend.position = c(.975, .975),
   legend.justification = c("right", "top"), legend.box.just = "right",
   legend.box.margin = margin(3,3,3,3)) + mytheme02 +
  theme(panel.background = element_blank(), 
   panel.grid.major.y = element_blank(), 
   panel.grid.major.x = element_line(size = .5, color = "lightgrey", linetype="dashed"))+
  theme(plot.margin = unit(c(0.5,0.75,0.5,0.25), "cm"))+

  geom_hline(mapping=NULL, yintercept=minors, colour="lightgrey", linetype="dashed", size = .5)+
  annotate("rect", xmin=wf$Date[1], xmax=wf$Date[nrow(wf)], ymin=5, ymax=20, alpha=0.1, fill="lightgrey") 
  print(myscat)

这会产生:

我尝试 color="Year" 并且 Year is a factor ->{2016, 2017, 2018} 没有成功。这甚至可能吗?

【问题讨论】:

    标签: r ggplot2 time-series


    【解决方案1】:

    您应该在初始 ggplot 调用中指定美学。试试这个:

    ggplot(wf, aes(x=Date, y=Gals, group = Year, colour = Year)) +
      geom_line()
    

    编辑:

    示例数据:

    wf <- structure(list(Date = structure(c(17095, 17096, 17097, 17098, 17099, 17100, 17095,
                                        17096, 17097, 17098, 17099, 17100, 17095, 17096, 
                                        17097, 17098, 17099, 17100, 17095, 17096, 17097, 
                                        17098, 17099, 17100), class = "Date"), 
                     Year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
                                        3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), 
                                      .Label = c("2016", "2017", "2018"), class = "factor"), 
                     Gals = c(6, 6, 12.4, 26.8, 33.3, 28.3, 6, 28.3, 33.3, 6, 26.8, 12.4, 
                              33.3, 28.3, 26.8, 6, 12.4, 33.3, 6, 26.8, 6, 12.4, 28.3, 6), 
                     Days = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
                              1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), 
                     GpD = c(6, 6, 12.4, 26.8, 33.3, 28.3, 6, 6, 12.4, 26.8, 33.3, 28.3, 
                             6, 6, 12.4, 26.8, 33.3, 28.3, 6, 6, 12.4, 26.8, 33.3, 28.3), 
                     GpM = c(186, 186, 384.4, 830.8, 1032.3, 877.3, 186, 186, 384.4, 830.8, 
                             1032.3, 877.3, 186, 186, 384.4, 830.8, 1032.3, 877.3, 186, 
                             186, 384.4, 830.8, 1032.3, 877.3)), 
                .Names = c("Date", "Year", "Gals", "Days", "GpD", "GpM"), 
                class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -24L))
    

    绘图调用:

    ggplot(wf, aes(x=Date, y=Gals, group = Year, colour = Year)) + # Specifies colour inside aesthetics
      geom_line() +
      scale_color_manual(values=c('dodgerblue2', 'red', 'orange')) +
      geom_hline(aes(yintercept = mean(wf$Gals)), colour = "pink", size=1) # <- Colour outside aesthetics
    

    图表:

    【讨论】:

    • 抱歉,我使用 G_T 的答案发布了运行答案时收到的一些格式的内容...DeS
    • 上述答案将根据所问的问题以不同的颜色绘制Gals 的每一年。您收到的错误是因为您不正确地使用了格式。由于Gals 的颜色取决于Year 列中应由美学控制的内容。由于像你的水平线这样的东西不依赖于原始数据框,你不应该在美学中指定它们。请参阅我编辑的示例。