如何添加图例来识别 ggplot 中的垂直线?

Cau*_*der 0 r ggplot2

我有一个图表,显示操作系统的移动使用情况。我想添加垂直线来标识这些操作系统的发布时间。我将通过图表,然后是代码。

图表 -

在此处输入图片说明

编码 -

  dev %>% 
  group_by(os) %>% 
  mutate(monthly_change = prop - lag(prop)) %>% 
  ggplot(aes(month, monthly_change, color = os)) +
  geom_line() +
  geom_vline(xintercept = as.numeric(ymd("2013-10-01"))) +
  geom_text(label = "KitKat", x = as.numeric(ymd("2013-10-01")) + 80, y = -.5)
Run Code Online (Sandbox Code Playgroud)

我不想在图中添加文本,而是想创建一个图例来标识每一行。我想给他们每个人自己的颜色,然后有一个图例来识别每个人。像这样的东西——

在此处输入图片说明

我可以像这样制作自己的自定义图例吗?

G. *_*eck 5

1)定义一个包含线数据的数据框,然后使用geom_vline它。请注意,这BOD是 R 附带的数据框。

line.data <- data.frame(xintercept = c(2, 4), Lines = c("lower", "upper"),
  color = c("red", "blue"), stringsAsFactors = FALSE)

ggplot(BOD, aes( Time, demand ) ) + 
  geom_point() + 
  geom_vline(aes(xintercept = xintercept, color = Lines), line.data, size = 1) +
  scale_colour_manual(values = line.data$color)
Run Code Online (Sandbox Code Playgroud)

截屏

2)或者将标签放在情节本身上以避免额外的图例。使用line.data上面的框架。这也具有避免可能具有相同美感的多个图例的优点。

ggplot(BOD, aes( Time, demand ) ) + 
  geom_point() + 
  annotate("text", line.data$xintercept, max(BOD$demand), hjust = -.25, 
    label = line.data$Lines) +
  geom_vline(aes(xintercept = xintercept), line.data, size = 1)
Run Code Online (Sandbox Code Playgroud)

截屏

3)如果真正的问题是您想要两个颜色图例,那么有两个包可以提供帮助。

3a) ggnewscale 调用后出现的任何颜色几何体new_scale_color都将获得自己的比例。

library(ggnewscale)

BOD$g <- gl(2, 3, labels = c("group1", "group2"))

line.data <- data.frame(xintercept = c(2, 4), Lines = c("lower", "upper"),
  color = c("red", "blue"), stringsAsFactors = FALSE)

ggplot(BOD, aes( Time, demand ) ) + 
  geom_point(aes(colour = g)) + 
  scale_colour_manual(values = c("red", "orange")) +
  new_scale_color() +
  geom_vline(aes(xintercept = xintercept, colour = line.data$color), line.data, 
    size = 1) +
  scale_colour_manual(values = line.data$color)
Run Code Online (Sandbox Code Playgroud)

3b) 中继器实验中继器包(仅在 github 上)允许定义两种颜色美学,color并且color2,例如,然后为每个具有单独的比例。

library(dplyr)
library(relayer)

BOD$g <- gl(2, 3, labels = c("group1", "group2"))

ggplot(BOD, aes( Time, demand ) ) + 
  geom_point(aes(colour = g)) + 
  geom_vline(aes(xintercept = xintercept, colour2 = line.data$color), line.data, 
    size = 1) %>% rename_geom_aes(new_aes = c("colour" = "colour2")) +
  scale_colour_manual(aesthetics = "colour", values = c("red", "orange")) +
  scale_colour_manual(aesthetics = "colour2", values = line.data$color)
Run Code Online (Sandbox Code Playgroud)

截屏