ggplot2中多层图例的控制

4

我的问题与R:Custom Legend for Multiple Layer ggplotFormat legend for multiple layers ggplot2密切相关,即我想为多层绘图创建自定义图例。但是,有一个微妙的差异: 在原始问题中,期望的效果是从两种不同的分组方法:fillcolor中分离出来,因此可以使用两个不同的scale_XXX函数。在我的情况下,我创建了一个包含点(一层)和线(第二层)的图。这两个层通过颜色区分:

x <- seq(0, 10, .1)
y <- sin(x)
lbl <- ifelse(y > 0, 'positive', 'non-positive')
data.one <- data.frame(x=x, y=y, lbl=lbl)

data.two <- data.frame(x=c(0, 10, 0, 10), y=c(-0.5, -0.5, 0.5, 0.5), classification=c('low', 'low', 'high', 'high'))
plt <- ggplot(data.one) + geom_point(aes(x, y, color=lbl)) + scale_color_discrete(name='one', guide='legend')
plt <- plt + geom_line(data=data.two, aes(x, y, color=classification)) + scale_color_discrete(name='two', guide='legend')
print(plt)

这是结果:

before

我想要的是将点和线的图例分开,使图例看起来像这样:

after

我找不到一种方法来适应引用问题的方法。有什么想法吗?


1
您可以查看此帖子及其中的评论,例如“ggplot2的设计不允许为同一美学设置多个图例”。因此,解决方案可能会有些hack-ish。 - Henrik
1个回答

6
以下是一个技巧。它从临时图表中提取图例,然后使用grid.arrange将所有内容组合在一起。
g_legend<-function(a.gplot){
  tmp <- ggplot_gtable(ggplot_build(a.gplot))
  leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
  legend <- tmp$grobs[[leg]]
  return(legend)}

n <- 4; cols <- hcl(h=seq(15, 375-360/n, length=n)%%360, c=100, l=65)

cols1 <- cols[4:3]
names(cols1) <-  c("positive", "non-positive")
plt_1 <- ggplot(data.one) + 
  geom_point(data=data.one,aes(x, y, color=lbl)) +
  scale_color_manual(values=cols1)


cols2 <- cols[1:2]
names(cols2) <-  c("high", "low")
plt_2 <- ggplot(data.one) + 
  geom_line(data=data.two, aes(x, y, color=classification)) +
  scale_color_manual(values=cols2)
  

mylegend_1<-g_legend(plt_1)
mylegend_2<-g_legend(plt_2)

plt <- ggplot(data.one) + 
  geom_point(data=data.one,aes(x, y, color=lbl)) +
  geom_line(data=data.two, aes(x, y, color=classification)) +
  scale_color_discrete(guide="none")

library(gridExtra)
grid.arrange(plt,
             arrangeGrob(mylegend_1, mylegend_2, nrow=6),
             ncol=2,widths=c(7,1))

这里输入图片描述

您需要再稍微调整一下来达到期望输出中的对齐效果。


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