使用基于两个变量的颜色和线型创建ggplot图例

时间:2016-01-08 13:18:31

标签: ggplot2 legend

Creating a ggplot legend with both color and shape中,有方法如何组合形状和颜色,但基于一个变量。我想知道如果将变量分成两个变量,这是否可行。

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() 

有可能吗?我不想使用组合变量的原因是我不想创建我不需要进行分析的变量。另一个原因是看看如何手动定制图例。 感谢帮助。

1 个答案:

答案 0 :(得分: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