ggplot中geom_vline与geom_hline共用图例的线条顺序控制方法
图例默认排序规则
ggplot2中共享同一美学映射(这里是linetype)的图例条目,默认按映射的离散值的字母升序排序。你代码中直接在aes里传入的linetype分类值分别是os 1、os 2、dashed、dashed 2,字母序中d开头的优先级高于o开头,所以水平线的两个条目默认排在垂直线前面。
实现自定义排序的方法
只需要在scale_linetype_manual中通过breaks参数指定你需要的条目顺序即可,同时需要注意values、override.aes中的颜色顺序要和breaks的顺序一一对应。另外你原有自定义图例键的逻辑有问题:黑色的垂直线os 2会被判定为绘制水平线条,需要同步调整判断逻辑。
修改后完整代码如下:
library(tidyverse) library(lubridate) set.seed(123) y <- rnorm(100) df <- tibble(y) %>% mutate(os = factor(rep_len(1:5, 100)), date = seq(from = ymd('2013-01-01'), by = 1, length.out = 100)) # 修改自定义图例键的判断逻辑,按标签类型区分垂直/水平 draw_key_cust <- function(data, params, size) { if (grepl("^os", data$linetype)) # 垂直线标签以os开头 draw_key_vpath(data, params, size) else # 其余为水平线 draw_key_path(data, params, size) } ggplot(df, aes(x = date, y = y, colour = os)) + geom_line() + geom_vline( aes(xintercept = min(date), linetype = 'os 1'), colour = 'red', key_glyph = "cust") + geom_vline( aes(xintercept = median(date), linetype = 'os 2'), colour = 'black', key_glyph = "cust") + geom_hline( aes(yintercept = 1, linetype = "dashed"), colour = "blue", key_glyph = "cust" ) + geom_hline( aes(yintercept = -1, linetype = "dashed 2"), colour = "purple", key_glyph = "cust" ) + scale_linetype_manual( name = 'lines', # 按需求指定顺序:2条垂直线在前,2条水平线在后 breaks = c("os 1", "os 2", "dashed", "dashed 2"), # 对应顺序的线型值 values = c(2, 2, 1, 1), guide = guide_legend( # 颜色顺序和breaks保持一致 override.aes = list(colour = c('red', 'black', 'blue', "purple")) ) )
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

