ggplot2 中同一图例中的不同图例键

Different legend-keys inside same legend in ggplot2

提问人:Michele 提问时间:5/1/2013 最后编辑:Gregor ThomasMichele 更新时间:10/4/2022 访问量:7791

问:

假设我不需要“适当”的变量映射,但仍然希望有图例键来帮助理解图表。我的实际数据类似于以下 df

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))

library(ggplot2)

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, colour = "points"))

enter image description here

基本上,我希望图例键相对于是..只是一个点,中间没有线。我用这个接近了这一点:points

library(reshape2)

df <- melt(df, id.vars="id")

ggplot() +
  geom_point(aes(id, value, shape = variable), df[df$variable=="points",]) +
  geom_line(aes(id, value, colour = variable), df[df$variable=="line",])

但它定义了两个独立的图例。修复第二个代码(并且必须重塑我的数据)也可以,但我更喜欢一种方法(如果有的话)来手动更改任何图例键(并继续使用第一个 approch)。谢谢!

编辑:

谢谢你刷新了我关于变量映射的记忆@alexwhan。但是,到目前为止,我得到的最简单的方法仍然是以下(非常糟糕的黑客!

df <- data.frame(id = 1:10, line = rnorm(10), points = rnorm(10))

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, shape = "points")) +
  theme(legend.title=element_blank())

这只是隐藏了两个不同传奇的标题。

enter image description here

其他想法非常受欢迎!!

GGPLOT2 图例属性 R-FAQ

评论


答:

6赞 alexwhan 5/1/2013 #1

我不知道有什么方法可以轻松做到这一点,但你可以做一个这样的黑客版本(使用你融化的数据帧):

p <- ggplot(df.m, aes(id, value)) +
  geom_line(aes(colour = variable, linetype = variable)) + scale_linetype_manual(values = c(1,0)) +
  geom_point(aes(colour = variable, alpha = variable)) + scale_alpha_manual(values = c(0,1))

enter image description here

关键是您需要获得正确的映射才能使其在图例中正确显示。在这种情况下,让它“正确”意味着愚弄它看起来像你想要的样子。可能值得指出的是,这仅有效,因为您可以设置为空白 (0),然后使用分数的刻度。您不能同时使用两者,因为它只需要一个比例。linetypealphaalpha

32赞 Didzis Elferts 5/14/2013 #2

您可以使用 inside 函数更改图例的默认外观。在这种情况下,您的指南是,然后您应该设置为删除线条的形状,然后从点中删除线条。override.aes=guides()color=shape=c(NA,16)linetype=c(1,0)

ggplot(df) +
  geom_line(aes(id, line, colour = "line")) +
  geom_point(aes(id, points, colour = "points"))+
  guides(color=guide_legend(override.aes=list(shape=c(NA,16),linetype=c(1,0))))

enter image description here

评论

0赞 Michele 5/16/2013
非常好的方法。可能是最好的。我只是想等别人,但似乎这也是唯一的一个:-)。无论如何,非常感谢!