You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:24:03