首页 > 解决方案 > 如何添加图例以识别 ggplot 中的垂直线?

问题描述

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

图表 -

在此处输入图像描述

编码 -

  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)

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

在此处输入图像描述

我可以像这样制作自己的自定义传奇吗?

标签: rggplot2

解决方案


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)

截屏

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)

截屏

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)

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)

截屏


推荐阅读