R - 结合 geom_vline 和 geom_smooth 在图例中

13

在我的ggplot2图表中添加geom_smooth()geom_vline()后,我的图例出现了一些奇怪的行为。以下是一个可重现的示例:

library(ggplot2)
n <- 60

set.seed(123)
df <- data.frame(Area = sample(c("A", "B", "C", "D"), size = n, replace = TRUE),
             x = runif(n),
             y = runif(n),
             Type = sample(c("I", "II"), size = n, replace = TRUE),
             Result = sample(c("K", "L", "M"), size = n, replace = TRUE))

df.breaks <- data.frame(Area = c("B", "C"), x = c(0.8, 0.3))

ggplot(df, aes(x = x, y = y)) + 
  geom_point(aes(colour = Result, shape = Type), size = 3) + 
  geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) + 
  geom_hline(yintercept = 0.3) + 
  facet_wrap(~Area) + 
  geom_vline(data = df.breaks, aes(xintercept = x, linetype = "Break"), colour = "purple") + 
  scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
  scale_linetype_manual(name = "Lines", values = c("Break" = "dashed", "Smooth" = "solid"))

enter image description here

请注意,“线条”图例中的每个项目都有垂直和水平线条,在第一种情况下有几条虚线,在第二种情况下有几条实线。我正在尝试调整我的代码,以生成具有以下内容的图例:(1)一个水平的绿色线和旁边的一个名为“平滑”的键,以及(2)一个垂直的紫色虚线和旁边的一个名为“断点”的键。我会感激一些帮助,因为无论我尝试什么(包括在aes()内/外使用linetype等,或使用scale_linetype_identity(),甚至是guides中的override.aes选项),我都找不到正确的组合!
我搜索了类似的示例,尽管我找到了其他帖子上有一个叠加的垂直线条colourfillshape等,但我没有找到一个与我的linetype图例上垂直线条相同的。任何帮助将不胜感激!谢谢!

2
也许这可以帮助 https://groups.google.com/forum/embed/#!topic/ggplot2/pv_CGdzPWnE - MLavoie
1
我能想到的唯一接近的方法是使用fill来代替linetype,创建两个单独的图例,以实现平滑。 - aosmith
1
跨贴而不链接这两个帖子被认为是一种欺骗,因为有人可能会花时间解决已经在其他地方解决的问题。http://www.talkstats.com/showthread.php/63630-A-question-on-legends - Tyler Rinker
@aomith 你能否把你的评论转化为答案,这样我就可以接受它了吗?如果你不想再花更多时间在这上面,那么我使用的是(基于你的建议):geom_smooth(aes(fill = "Smooth"), colour = "green", se = FALSE) 并且与两个图例一起工作。 - Constantinos
你可以自己回答这个问题。我对此记忆不太清楚。 - aosmith
显示剩余2条评论
1个回答

2

对于这个问题的回复有些晚了,但我认为最好提供一个答案以备其他人(或者未来的我!)感兴趣。

在评论区中遵循@aosmith的建议,并得到他的鼓励后,我最终用以下代码替换了绘图的代码:

ggplot(df, aes(x = x, y = y)) + 
     geom_point(aes(colour = Result, shape = Type), size = 3) + 
     geom_hline(yintercept = 0.3) + 
     facet_wrap(~Area) + 
     geom_vline(data = df.breaks, 
                aes(xintercept = x, linetype = "Break"), colour = "purple") + 
     scale_colour_manual(values = c("K" = "red", "L" = "orange", "M" = "blue")) + 
     scale_linetype_manual(name = "Lines",
                           values = c("Break" = "dashed", "Smooth" = "solid")) + 
     geom_smooth(aes(fill = "Smooth"), method = "loess", colour = "green", se = FALSE) + 
     scale_fill_discrete(name = "")

上面的最后两行代码替换了原始代码中的以下行:
geom_smooth(aes(linetype = "Smooth"), colour = "green", se = FALSE) +
结果图表仍需要一些调整,特别是在图例间隔方面,但它解决了原始问题。
竖直和水平线图例

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