1

I have a data set which could be defined thus:

Week <- c("2015_52", "2016_01", "2016_02", "2016_03", "2016_04")
y1 <- runif(5, 0, 1)
y2 <- runif(5, 0, 1)
y3 <- runif(5, 0, 1)
df <- data.frame(Week, y1, y2, y3)

I want to plot all three of the y's over time on the same ggplot (with manual colors and linetype for each one), but I'm new to ggplot and have not had to do this before. Trying to emulate answers to similar questions on StackOverflow is delivering errors.

For instance...

library(ggplot2)
ggplot(df, aes(x = Week, y = value, colour = variable)) + 
  geom_line()

...as in this question gives the error Error in eval(expr, envir, enclos) : object 'value' not found.

But trying as in the answer to this question...

ggplot() + 
  geom_line(data = df, 
            aes(x = Week, y = y1, 
                color = "black", linetype = "solid")) + 
  geom_line(data = df, 
            aes(x = Week, y = y2, 
                color = "red", linetype = "solid")) +
  geom_line(data = df,
            aes(x = Week, y = y3, 
                color = "orange", linetype = "dashed"))

...gives three instances of the error geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?. Can I get some assistance, please?

4
  • 1
    The only way to do this right is to convert the data from wide format (as you have defined it) to long format with something like the reshape2 package. Painful to learn, but once you do you will never look back. Commented Jun 7, 2016 at 20:41
  • 1
    Here is a good answer to look at: stackoverflow.com/questions/2564258/… Commented Jun 7, 2016 at 20:46
  • Thanks, somehow missed that one when searching. Commented Jun 7, 2016 at 20:53
  • Any chance you could mark this correct? Commented Jul 11, 2017 at 13:26

1 Answer 1

6

Actually this is what you really want I think:

library(ggplot2)
library(reshape2)

set.seed(123)
Week <- c("2015_52", "2016_01", "2016_02", "2016_03", "2016_04")
y1 <- runif(5, 0, 1)
y2 <- runif(5, 0, 1)
y3 <- runif(5, 0, 1)
df <- data.frame(Week, y1, y2, y3)

mdf <- melt(df,id.vars="Week")

ggplot(mdf, aes( x=Week, y=value, colour=variable, group=variable )) + 
  geom_line() +
  scale_color_manual(values=c("y1"="black","y2"="red","y3"="orange")) +
  scale_linetype_manual(values=c("y1"="solid","y2"="solid","y3"="dashed"))

Note that leaving the group=variable out will cause the following dreaded message:

geom_path: Each group consists of only one observation. Do you need to adjust the group
aesthetic?

yielding:

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

Aha! It was the string-type Week values which were causing me to get the "Each group consists of only one observation" error. Much thanks.
np. Would appreciate a correct check of course :)
Not happy with the week labels yet. Am figuring this out.
Ok, there we go. Finally groking the group aes.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.