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

3
创建既有颜色又有形状的ggplot图例中,有一种方法可以将形状和颜色合并,但基于一个变量。我想知道如果该变量分为两个变量是否可能。
这是一个测试数据:
(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
创建数据框仅用于单个绘图,特别是对于复杂的绘图来说是非常普遍和经常必要的。我并不认为这是一个问题。但无论如何,这是一个好问题。 - Mike Wise
1个回答

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


非常感谢!ggplot不断地用新的命令/参数/函数给我带来惊喜,比如interaction - giordano
交互是基础! - arvi1000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接