我有一个图表,显示操作系统的移动使用情况。我想添加垂直线来标识这些操作系统的发布时间。我将通过图表,然后是代码。
图表 -
编码 -
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)
我不想在图中添加文本,而是想创建一个图例来标识每一行。我想给他们每个人自己的颜色,然后有一个图例来识别每个人。像这样的东西——
我可以像这样制作自己的自定义图例吗?
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)