naught101
naught101

Reputation: 19553

Add arbitrary series with legend in ggplot2?

I have a bunch of data - three timeseries (model group means), coloured by group, with standard deviation represented by geom_ribbon. By default they have a nice legend on the side. I also have a single timeseries of observations, that I want to overlay over the plot (without the geom_ribbon), like this:

df <- data.frame(year=1991:2010, group=c(rep('group1',20), rep('group2',20), rep('group3',20)), mean=c(cumsum(abs(rnorm(20))),cumsum(abs(rnorm(20))),cumsum(abs(rnorm(20)))),sd=3+rnorm(60))
obs_df <- data.frame(year=1991:2010, value=cumsum(abs(rnorm(20))))
ggplot(df, aes(x=year, y=mean)) + geom_line(aes(colour=group)) + geom_ribbon(aes(ymax=mean+sd, ymin=mean-sd, fill=group), alpha = 0.2) +geom_line(data=obs_df, aes(x=year, y=value))

But the observations does appear on the legend, because it's not coloured (I want it black). How can I add the obs to the legend?

Upvotes: 1

Views: 2105

Answers (2)

Sven Hohenstein
Sven Hohenstein

Reputation: 81703

First, create a combined data frame of df and obs_df:

dat <- rbind(df, data.frame(year = obs_df$year,  
                  group = "obs", mean = obs_df$value, sd = 0))

Plot:

ggplot(dat, aes(x=year, y=mean)) +
geom_line(aes(colour=group)) +
geom_ribbon(aes(ymax=mean+sd, ymin=mean-sd, fill=group), alpha = 0.2) +
scale_colour_manual(values = c("red", "green", "blue", "black")) +
scale_fill_manual(values = c("red", "green", "blue", NA))

plot

Upvotes: 6

IRTFM
IRTFM

Reputation: 263391

I'm guessing you made an error with your construction of 'obs_df'. If you create it with year = 1991:2010 it makes more sense in the context of the rest of the data and it gives you the plot you are hoping for with the ggplot call unchanged.

Upvotes: 0

Related Questions