r - 如何添加图例以识别 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)
我不想在图中添加文本,而是创建一个图例来识别每条线。我想给他们每个人自己的颜色,然后有一个图例来识别每个人。像这样的东西-
我可以像这样制作自己的自定义传奇吗?
解决方案
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)
推荐阅读
- function - 测试条件输入是否是c ++中的字符
- python - 无效的语法 - kivy
- javascript - Javascript:对象数组的数据验证
- android - Kotlin lambda 自定义参数名称不适用于 Calendar.getInstance()
- d3.js - 在 D3 散点图中,如何将可变大小的图像锚定到坐标/点的中心
- vue.js - 使用突变渲染输入表单
- python - NumPy 中的 ValueError:形状未对齐
- c# - 将数字添加到按钮单击 C# ViewModel 上的列表框
- python - 如何修复计数功能
- c# - Winfroms 应用程序的 Office 文字编辑器控件