0

The following code is used to plot a number of different conditions using a combination of colours and linetypes. It plots "R" using a line and "W" using a dashed line.

I'd like to split the legend into two parts: Condition for "H C" and "I C", and Model type for "R" and "W". In Condition, we want to represent lines' color. In Model type, we want to represent lines' type (e.g. dashed and non dashed lines in black).

Since I am using pipes, I have not found a solution for this so far.

library(ggplot2)
library(scales)
tribble(    ~y,    ~cb,   ~z,    ~x,
            1     , 0,   "H C R"    ,1,
            2     , 1,   "H C R"    ,1,
            2     , 0,   "I C R"    ,1,
            3     , 1,   "I C R"    ,1,
            1.5   , 0,   "H C W"    ,1,
            2     , 1,   "H C W"    ,1,
            2     , 0,   "I C W"    ,1,
            2     , 1,   "I C W"    ,1,
            3     , 0,   "H C R"    ,2,
            3     , 1,   "H C R"    ,2,
            0.5   , 0,   "I C R"    ,2,
            2     , 1,   "I C R"    ,2,
            2     , 0,   "H C W"    ,2,
            2     , 1,   "H C W"    ,2,
            1     , 0,   "I C W"    ,2,
            1     , 1,   "I C W"    ,2)-> datos


aux<-datos %>%
  group_by(x, z, cb) %>%
  summarise(media = mean(y), 
            desvio = rnorm(1),
            error_est = desvio / sqrt(n()),             
            intervalo_sup = media + (2*error_est),       
            intervalo_inf = media - (2*error_est)) #%>%


library(RColorBrewer)
display.brewer.pal(11,name = "Spectral")  
brewer.pal(n = 11, name = "Spectral")
# Que la línea de condición "H C" apareciera en el color anaranjado que utiliza la paleta "Spectral".
# Que la línea de condición "I C" apareciera en el color verde oscuro que utiliza la paleta "Spectral".
colores<-brewer.pal(n = 11, name = "Spectral")[c(3,3,9,9)]




  ggplot() +

  geom_line(data=aux%>%filter(grepl("W",z)),
            aes(x = x, y = media, color = z,group = z),
            size=0.5,
            linetype = "dashed") +                      
  geom_errorbar(data=aux%>%filter(grepl("W",z)),aes(x = x, color = z,
                              ymax = intervalo_sup,               
                    ymin = intervalo_inf),
                width=0.3) + 

    geom_line(data=aux%>%filter(!grepl("W",z)),
              aes(x = x, y = media, color = z,group = z),
              size=0.5) +                      
    geom_errorbar(data=aux%>%filter(!grepl("W",z)),
                  aes(x = x, color = z,
                                ymax = intervalo_sup,               
                                ymin = intervalo_inf),
                  width=0.3)+
  labs(x = "x", y = "y", color = "Condition") +

  scale_color_manual(values=colores) +
  scale_x_continuous(breaks = seq(1,7, by=1)) +
  theme(legend.position="bottom", legend.text=element_text(size=12)) +
  guides(color=guide_legend(ncol=2)) +
  theme(axis.text=element_text(size=14),
        axis.title=element_text(size=14))+
  facet_wrap(~cb)

enter image description here

pyring
  • 347
  • 2
  • 17
  • You may want to have a look at this https://stackoverflow.com/questions/27803710/ggplot2-divide-legend-into-two-columns-each-with-its-own-title – aaumai Jul 15 '19 at 21:47
  • @aaumai thanks for this. You're right that question is useful to divide the legend into two groups. However, I attempt to divide also the labels of each level in the legend. – pyring Jul 16 '19 at 10:39

1 Answers1

0

Solution using stringr.

library(dplyr)
library(ggplot2)
library(scales)
library(RColorBrewer)
library(stringr)

#Selection of desired colors
display.brewer.pal(11,name = "Spectral") 
colores<-brewer.pal(n = 11, name = "Spectral")[c(3,9)]

#Stats
datos %>%
  group_by(x, z, cb) %>%
  summarise(media = mean(y), 
            desvio = rnorm(1),                         
            error_est = desvio / sqrt(n()),             
            intervalo_sup = media + (2*error_est),       
            intervalo_inf = media - (2*error_est))%>%
  #Two columns for color and linetype (be careful when using stringr)
  mutate(Model=str_split(z," ")[[1]][3],
         Condition=str_remove(z,Model)
            )%>%
  #Plot
ggplot(aes(x = x, y = media, color = Condition,group = z)) +
  geom_line(aes(linetype=Model, color=Condition),size=0.5)+
  geom_errorbar(aes(x = x, color = Condition,
                    ymax = intervalo_sup,               
                    ymin = intervalo_inf),
                width=0.3)+
  scale_color_manual(values=colores) +
  scale_x_continuous(breaks = seq(1,7, by=1)) +
  theme(legend.position="bottom", legend.text=element_text(size=12)) +
  theme(axis.text=element_text(size=14),
        axis.title=element_text(size=14))+
  facet_wrap(~cb)+
  # Legends' title
  guides(color=guide_legend("Condition"),
         linetype=guide_legend("Model"))  
pyring
  • 347
  • 2
  • 17