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

17

假设我不需要一个“正确”的变量映射,但仍然希望有图例来帮助理解图表。我的实际数据类似于以下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"))

这里输入图片描述

基本上,我希望与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",])

但它定义了两个不同的图例。修复第二段代码(并需要重新整理我的数据)也可以,但我更喜欢一种方式(如果有的话)手动更改任何图例键(并继续使用第一种方法)。谢谢!

编辑:

感谢@alexwhan您提醒我关于变量映射的内容。但是,到目前为止,我找到的最简单的方法仍然是以下内容(非常糟糕的hack!):

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

这只是隐藏了两个不同图例的标题。

输入图像描述

欢迎提出其他想法!

2个回答

32

你可以在 guides() 函数内使用 override.aes= 来更改图例的默认外观。在这种情况下,你的指南是 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))))

在此输入图片描述


非常好的方法。可能是目前最好的一个。我本来想等别人的,但看起来这也是唯一的一个 :-)。不管怎样,非常感谢! - Michele

6

我不知道有什么简便的方法可以做到这一点,但是您可以像这样进行黑客版操作(使用您的“融化”数据框):

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

在此输入图片描述

关键在于正确地进行映射,以便在图例中正确显示。在这种情况下,“正确”意味着欺骗它以按你想要的方式看起来。值得指出的是,这仅适用于您可以将 linetype 设置为 blank (0),并且然后使用 alpha 比例尺用于点的情况。您不能同时使用 alpha,因为它只会采用一个比例尺。


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