2016-01-08 1 views
1

В Creating a ggplot legend with both color and shape существует способ объединения формы и цвета, но на основе одной переменной. Интересно, возможно ли это, если переменная разделена на две переменные.Создание легенды ggplot с цветом и типом линии на основе двух переменных

Hier тест данные:

(x <- data.frame(time =rep(1:5,4) 
       , sex = rep(c("m","f"), each=5) 
       , val_type = rep(c("obs","fit"),each=10) 
       , val = rep(1:4,each=5)*rep(1:5,4) 
       ) 
) 

Чтобы показать, как я хочу иметь легенду я объединить две переменные:

x$sv <- paste(x$sex,x$val_type,sep='-') 

здесь является ggplot с одной переменной:

ggplot(data=x, aes(x=time, y=val, linetype=sv, col=sv)) + 
     geom_line() + 
     scale_colour_manual(name = "" 
          , values=c("red","red","blue","blue") 
          , labels=c("Female fitted","Female observed" 
            ,"Male fitted","Male observed") 
          ) + 
     scale_linetype_manual(name = "" 
          , values=c(1,2,1,2) 
          , labels=c("Female fitted","Female observed" 
            ,"Male fitted","Male observed") 
          ) 

и вот участок:

enter image description here

Я хотел бы иметь такую ​​же легенду, но с использованием двух переменных отдельно

ggplot(data=x, aes(x=time, y=val, linetype=val_type, col=sex)) + 
     geom_line() 

Возможно ли это? Причина, по которой я не хочу использовать комбинированную переменную, заключается в том, что я не хочу создавать переменные, которые мне не нужны для анализа. Другая причина - увидеть, как легенда может быть настроена вручную. Спасибо за помощь.

+2

Это является довольно распространенным и часто необходимо создать фрейм данных только для одного участка, особенно для сложных участков. Я не вижу в этом проблемы. Но это хороший вопрос. –

ответ

2

Я не вижу создания новой переменной в качестве серьезной проблемы (особенно если вы будете использовать трубы). Но, да, это возможно, используя функцию interaction и используя определения ручной шкалы.

ggplot(data = x, 
     aes(x = time, 
      y = val, 
      linetype = interaction(val_type, sex), 
      col = interaction(val_type, sex))) + 
    geom_line() + 
    scale_colour_manual(name = "" 
         , values=c("red","red","blue","blue") 
         , labels=c("Female fitted","Female observed" 
           ,"Male fitted","Male observed") 
) + 
    scale_linetype_manual(name = "" 
         , values=c(1,2,1,2) 
         , labels=c("Female fitted","Female observed" 
            ,"Male fitted","Male observed") 
) 

enter image description here

+0

Спасибо большое! ggplot постоянно удивляет меня новыми командами/параметрами/функциями, например, «взаимодействием». – giordano

+0

('взаимодействие' - из базы!) – arvi1000