假设我不需要'正确'的变量映射,但仍希望使用图例键来帮助理解图表。我的实际数据类似于以下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",])
但它定义了两个单独的传说。修复第二个代码(并且必须重塑我的数据)也没关系,但我更喜欢一种方法(如果有的话)手动更改任何图例键(并继续使用第一个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())
这只是隐藏了两个不同图例的标题。
其他想法超过欢迎!!!
答案 0 :(得分:31)
您可以在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))))
答案 1 :(得分: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
设置为空白(0),然后使用alpha
比例来表示这些点。您不能同时使用alpha
,因为它只需要一个比例。