执行此操作的一个好方法是使用mapping= 在同一情节中为您创建第二个图例。关键是对垂直线与其他线和点使用不同的美感。
首先,示例数据和绘图:
library(ggplot2)
library(dplyr)
library(tidyr)
set.seed(8675309)
df <- data.frame(x=rep(1:25, 4), y=rnorm(100, 10, 2), lineColor=rep(paste0("col",1:4), 25))
base_plot <-
df %>%
ggplot(aes(x=x, y=y)) +
geom_line(aes(color=lineColor)) +
scale_color_brewer(palette="Greens")
base_plot
现在像 OP 在他们的问题中所做的那样添加垂直线:
base_plot +
geom_vline(xintercept = c(1,9,11), linetype="dotted",
color = "red", size=1) +
geom_vline(xintercept = c(5,14,17), linetype="dotted",
color = "blue", size=1)
要添加图例,我们需要在mapping= 中添加另一种美学。当您使用aes() 时,ggplot2 期望映射包含与data= 中指定的数据集相同数量的观察值。在这种情况下,df 有 100 个观察值,但我们只需要 6 行。解决这个问题的最简单方法是创建一个单独的小数据集,用于垂直线。这个数据框只需要包含两列:一列用于xintercept,另一列可以映射到linetype:
verticals <- data.frame(
intercepts=c(1,9,11,5,14,17),
Events=rep(c("Closure", "Opening"), each=3)
)
然后您可以在代码中使用它,并将一个 geom_vline() 调用添加到我们的基础图中:
second_plot <- base_plot +
geom_vline(
data=verticals,
mapping=aes(xintercept=intercepts, linetype=Events),
size=0.8, color='blue',
key_glyph="path" # this makes the legend key horizontal lines, not vertical
)
second_plot
虽然此答案不使用颜色来区分垂直线,但它最符合 ggplot2 所基于的图形语法原则。颜色已经用于指示数据中的差异,因此您可能希望使用不同的美学来分离垂直线。我使用了其中一些 GG 原则来整理这个答案 - 抱歉,调色板虽然很垃圾,但哈哈。在这种情况下,我对数据行使用了顺序色标,并使用不同的颜色来分隔垂直线。我显示的垂直线大小与 df 中的线不同,以便更多区分并使用线型作为垂直线之间的区别美学。
您可以使用这个一般概念,并将您认为最适合您自己的数据的美学应用到您自己的数据中。