0

I have a multiple line plot with a segment of each line highlighted the same way as discussed here. Here is the reproducible example:

df <- data.frame(x = 1:100,y1 = rnorm(100,1,100),y2=rnorm(100,5,50),y3=rnorm(100,10,500),y4=rnorm(100,1,200),col1 = c(rep("red", 50), rep("black", 10), rep("red", 40)),col2=c(rep("blue", 50), rep("black", 10), rep("blue", 40)),col3=c(rep("orange", 50), rep("black", 10), rep("orange", 40)),col4=c(rep("cyan", 50), rep("black", 10), rep("cyan", 40)))

ggplot(df, aes(x=x, y=y1)) + geom_line(aes(colour=col1, group=1))+geom_line(aes(x=x, y=y2,col=col2,group=1))+geom_line(aes(x=x, y=y3,col=col3,group=1))+geom_line(aes(x=x, y=y4,colour=col4, group=1))+geom_line(aes(x=x, y=y4,col=col4,group=1))+scale_color_manual(values=c("black","blue","red","orange","cyan"),labels=c("new","s1on","s2off","s2_on","s1_off"),name="")

This gives the order of the items in the legend as shown in the image below. I want to reorder them. Since each line has a segment and each segment has the same color "black", I am not able to use breaks argument in scale_color_manual as it requires 5 values and the plot is plotted for 4 columns in the dataframe. How can I reorder the items in the legend in the order s1on, s2on, s1_off, s2_off and new? enter image description here

Pulsar_534511
  • 98
  • 1
  • 13

1 Answers1

3

This might be what you are looking for

 ggplot(df, aes(x=x, y=y1)) + 
  geom_line(aes(colour=col1, group=1)) +
  geom_line(aes(x=x, y=y2,col=col2,group=1)) +
  geom_line(aes(x=x, y=y3,col=col3,group=1)) +
  geom_line(aes(x=x, y=y4,colour=col4, group=1)) +
  geom_line(aes(x=x, y=y4,col=col4,group=1)) +
  scale_color_manual(breaks = c("blue","orange","cyan","red","black"),
                     values=c("blue" = "blue", "red" = "red","orange" = "orange","cyan" = "cyan","black" = "black"),
                     labels=c("s1on","s2_on","s1_off","s2off","new"),name="")

You can use breaks to reorder the legend. The values argument is mapping the right color to the right value.

It is easier for me to see if the values in df are different than the colors you want

df <- data.frame(x = 1:100,
             y1 = rnorm(100,1,100),
             y2=rnorm(100,5,50),
             y3=rnorm(100,10,500),
             y4=rnorm(100,1,200),
             col1 = c(rep("rrr", 50), 
                      rep("bbb", 10), 
                      rep("rrr", 40)),
             col2=c(rep("blbl", 50), 
                    rep("bbb", 10), 
                    rep("blbl", 40)),
             col3=c(rep("ooo", 50),
                    rep("bbb", 10), 
                    rep("ooo", 40)),
             col4=c(rep("ccc", 50), 
                    rep("bbb", 10), 
                    rep("ccc", 40)))

ggplot(df, aes(x=x, y=y1)) + 
  geom_line(aes(colour=col1, group=1)) +
  geom_line(aes(x=x, y=y2,col=col2,group=1)) +
  geom_line(aes(x=x, y=y3,col=col3,group=1)) +
  geom_line(aes(x=x, y=y4,colour=col4, group=1)) +
  geom_line(aes(x=x, y=y4,col=col4,group=1)) +
  scale_color_manual(breaks = c("blbl","ooo","ccc","rrr","bbb"),
                 values=c("blbl" = "blue", "rrr" = "red","ooo" = "orange","ccc" = "cyan","bbb" = "black"),
                 labels=c("s1on","s2_on","s1_off","s2off","new"),name="")
StephenK
  • 685
  • 5
  • 16