0

In the following ggplot2 with two series, US GDP and its moving average, the legend doesn't display the moving average series:

require(xts);require(data.table);require(ggplot2);require(ggthemes)

# US GDP quarterly data
data <- structure(list(ShortName = c("US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)","US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)",  "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)",  "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)","US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)",  "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)","US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)", "US GDP QoQ (Annualised)"), Date = structure(c(10681L, 10772L,10864L, 10956L, 11047L, 11138L, 11230L, 11322L, 11412L, 11503L,11595L, 11687L, 11777L, 11868L, 11960L, 12052L, 12142L, 12233L,12325L, 12417L, 12508L, 12599L, 12691L, 12783L, 12873L, 12964L,13056L, 13148L, 13238L, 13329L, 13421L, 13513L, 13603L, 13694L,13786L, 13878L, 13969L, 14060L, 14152L, 14244L, 14334L, 14425L,14517L, 14609L, 14699L, 14790L, 14882L, 14974L, 15064L, 15155L,15247L, 15339L, 15430L, 15521L, 15613L, 15705L, 15795L, 15886L,15978L, 16070L), class = c("IDate", "Date")), Value = c(3.8,3.4, 5.2, 7.1, 1.2, 7.8, 0.5, 2.1, -1.1, 2.1, -1.2, 1, 3.8, 2.2,1.9, 0.2, 2, 3.8, 6.9, 4.6, 2.4, 3.1, 3.6, 3.4, 4.5, 2.2, 3.3,2.2, 4.9, 1.3, 0.3, 3.2, 0.3, 3.1, 2.7, 1.5, -2.7, 2, -2, -8.3,-5.4, -0.4, 1.3, 3.9, 1.6, 3.9, 2.8, 2.8, -1.3, 3.2, 1.4, 4.9,3.7, 1.2, 2.8, 0.1, 1.1, 2.5, 4.1, 2.4)), .Names = c("ShortName","Date", "Value"), class = c("data.table", "data.frame"), row.names = c(NA,-60L))

ggplot(data, aes_string(x="Date", y="Value", colour="ShortName")) + 
  geom_line(size=1.2) +

  # add 4 quarter moving average series
  geom_line(aes(x=Date, 
                y=rollmean(Value, k=4, fill=NA, align="right"))
            , colour="red") +

  # the economist theme from package::ggthemes
  theme_economist_white(gray_bg=FALSE) + 
  scale_colour_economist() +
  xlab("") + ylab("")

Question: How to add the moving average series label to the legend, (text saying let's say "4-quarters moving avg"?

Bonus question: How to remove ShortName text from the legend?

Daniel Krizian
  • 4,586
  • 4
  • 38
  • 75

1 Answers1

1

Maybe specifying something to aesthetics

ggplot(data) + 
  geom_line(aes_string(x="Date", y="Value", colour="ShortName"), size=1.2) +
  # add 4 quarter moving average series
  geom_line(aes(x=Date, 
                y=rollmean(Value, k=4, fill=NA, align="right"),
                linetype =  'Moving average'),
            colour="red") +
  scale_colour_manual('', values = "blue") +
  scale_linetype_manual('', values = 1)

and with ggthemes

ggplot(data) + 
  geom_line(aes_string(x="Date", y="Value", colour="ShortName"), size=1.2) +
  # add 4 quarter moving average series
  geom_line(aes(x=Date, 
                y=rollmean(Value, k=4, fill=NA, align="right"),
                linetype =  'Moving average'),
            colour="red") +
  scale_colour_economist(name='') +
  #scale_colour_manual('', values = "blue") +
  scale_linetype_manual('', values = 1) +
  theme_economist_white(gray_bg=FALSE)

ggtheme plot

You may change the order of legend items with

plot <- ggplot(data) + 
  geom_line(aes_string(x="Date", y="Value", colour="ShortName"), size=1.2) +
  # add 4 quarter moving average series
  geom_line(aes(x=Date, 
                y=rollmean(Value, k=4, fill=NA, align="right"),
                linetype =  'Moving average'),
            colour="red") +
  scale_colour_economist(name='') +
  #scale_colour_manual('', values = "blue") +
  scale_linetype_manual('', values = 1) +
  theme_economist_white(gray_bg=FALSE)

plot + guides(colour = guide_legend(order = 1), 
              linetype = guide_legend(order = 2))

change legend order

Paulo E. Cardoso
  • 5,778
  • 32
  • 42
  • Can this be made compatible with The Economist theme (a must have)? Thanks for some pointers, I will fiddle some more – Daniel Krizian Mar 20 '14 at 12:40
  • @DanielKrizian Let me tell you that `rollmean` is completely new for me. Thanks! – Paulo E. Cardoso Mar 20 '14 at 12:53
  • excellent, we both learn! I understand that you added second series (moving average) as linetype, having own linetype legend, whereas the first series has colour legend (the only available in The Economist theme). So the two series have two separate legends, complicating the code a little bit – Daniel Krizian Mar 20 '14 at 15:57