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

如何用ggrepel在ggplot折线图中仅为每条线末端标注一次标签

问题描述

使用以下R代码绘制折线图时,所有数据点都被标注了run_number,希望通过ggrepel实现仅在每条折线的末端标注一次对应的run_number标签。

原代码:

ggplot(data = subset(df, !is.na(Q_time_ACU)),
     aes(x= P_ID, y= Q_time_ACU, group = run_number, color = run_number)) +
geom_line() +
geom_text_repel(aes(color= run_number, label=run_number),
            nudge_x = 1,
            na.rm = TRUE)

当前效果:所有数据点都带有run_number标签,不符合仅标注末端的需求。

数据示例:

structure(list(P_ID = c(376L, 428L, 466L, 485L, 395L, 326L, 456L,
272L, 466L, 475L, 180L, 304L, 303L, 385L, 191L, 497L, 260L, 451L,
344L, 359L, 423L, 274L, 230L, 490L, 517L, 209L, 287L, 391L, 327L,
325L), run_number = c(1, 1, 4, 2, 1, 0, 0, 4, 2, 4, 2, 4, 1,
2, 3, 2, 2, 0, 3, 2, 3, 4, 3, 4, 0, 2, 4, 2, 3, 1), Q_time_ACU = c(155.297842905938,
0, 21.4271518946689, 60.3274436437887, 118.8936588416, 0, 1.55912651680092,
0, 128.964632599987, 42.4219509382183, 86.2199178189735, 50.2110239869767,
20.3926736547664, 0, 95.011029120069, 181.809355977849, 11.809349897258,
0, 260.208890079978, 0, 293.343276590466, 9.82926880455261, 23.2166230653593,
0.974429831505859, 0, 0, 0.842701922981178, 0, 235.843120234284,
3.89812978069585)), row.names = c(574L, 611L, 1751L, 1084L, 583L,
149L, 290L, 1568L, 1058L, 1774L, 764L, 1615L, 499L, 984L, 1109L,
1086L, 854L, 280L, 1278L, 938L, 1368L, 1562L, 1141L, 1781L, 353L,
789L, 1574L, 969L, 1262L, 509L), class = "data.frame")
解决方案

要实现只在折线末端标注run_number,关键是只给每条折线的最后一个数据点添加标签,具体步骤如下:

1. 筛选每个折线的末端数据点

用dplyr分组后,提取每个run_number对应的最大P_ID(即折线最右侧的点)所在的行:

library(dplyr)
library(ggplot2)
library(ggrepel)

# 处理数据:过滤NA值后,取每个run_number组里P_ID最大的行
df_end <- subset(df, !is.na(Q_time_ACU)) %>%
  group_by(run_number) %>%
  filter(P_ID == max(P_ID)) %>%
  ungroup()

2. 修改绘图代码

原折线图部分保持不变,将geom_text_repel的数据源替换为筛选出的末端点数据:

ggplot(data = subset(df, !is.na(Q_time_ACU)),
       aes(x= P_ID, y= Q_time_ACU, group = run_number, color = run_number)) +
  geom_line() +
  geom_text_repel(data = df_end,  # 仅用末端点生成标签
                  aes(label=run_number),
                  nudge_x = 1,
                  na.rm = TRUE)

补充说明

  • 如果你的折线末端不是按P_ID最大定义,而是每组数据的最后一行,可以把filter(P_ID == max(P_ID))替换为slice_tail(n=1)。
  • 可根据图表实际情况调整nudge_x、nudge_y等参数,让标签位置更合理,避免重叠。

内容的提问来源于stack exchange,提问作者hillwalker101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:43:29