如何用ggrepel为split生成的分组折线添加自定义标签
问题1修复:解决单图显示全部4个标签的问题
你出现这个问题的核心原因是geom_text_repel调用的数据源是全局df的子集,而非当前lapply循环中分组后的子集i,把subset(df, date == 4)替换为subset(i, date == 4)即可保证每个分组仅显示对应2个国家的标签。
问题2实现:自定义每个标签的展示点位
你可以先创建一个标签位置配置表,指定每个国家对应的标签展示日期,再和当前分组数据匹配后筛选出对应点位作为标签数据源即可,示例如下:
完整修正后代码
library(tidyverse) library(ggrepel) library(cowplot) set.seed(1234) df <- tibble(date = c(rep(1,4), rep(2,4), rep(3,4), rep(4,4)), country = rep(c('a','b','c','d'),4), value = runif(16), cc = rep(c(1,1,2,2),4)) df$cc <- as.factor(df$cc) # 自定义标签位置配置:可根据需求修改每个country对应的label_date label_pos <- tibble( country = c("a", "b", "c", "d"), label_date = c(2, 1, 3, 4) ) # 生成分组图列表 ggList <- lapply(split(df, df$cc), function(i) { # 匹配当前分组内国家的标签位置 label_data <- i %>% left_join(label_pos, by = "country") %>% filter(date == label_date) ggplot(i, aes(x = date, y = value, color = country)) + geom_line(lwd = 1.1) + geom_text_repel(data = label_data, aes(label = country)) + theme(legend.position = "none") }) # 拼接网格图 cowplot::plot_grid(plotlist = ggList, ncol = 1, align = 'v', labels = levels(df$cc))
如果你需要调整标签的偏移、大小等样式,直接在geom_text_repel中添加nudge_x/nudge_y/size等参数即可。
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

