标签仅在geom_line图上改变

编程语言 2026-07-12

我想在折线图上为标签设定显示条件:只有当相对于前一个数据点的值发生变化时才显示标签。这是我现在图上的样子:

图上标注的数值过多的折线图

基本上,标签太多,我只想在数值发生变化时在图上标注。像这样:

仅在数值发生变化时在图上标注的折线图

先行致谢!

可复现的代码:

ref <- data.table(
  label = c("Homebase", "Newark, New Jersey", "Philadelphia, Pennsylvania", "Charleston, South Carolina"),
  value = 0:3
)
dt <- data.table(
  year = 1990:2009,
  value = c(0, rep(1, 3), 3, rep(1, 2), rep(2, 5), rep(3, 6), rep(2, 2))) %>%
  mutate(label = ref$label[match(value, ref$value)])

g <- ggplot(dt, aes(x = year, y = value)) +
  geom_line() +
  scale_y_continuous(labels = dt$label, breaks = dt$value) +
  geom_text_repel(aes(label = dt$label))

解决方案

另一种方法是在每个连续的 label 只取第一行。我们可以在调用plot之前这样做,或者有时更有效的一种做法(尤其是当 ggplot() 位于一连串/管道的数据变换命令之后)是,使用其rlang-~ 的伪函数接口来为特定的geom更改 data=

BTW, 在ggplot的美学映射中最好不要使用 dt$

可运行的代码:

ggplot(dt, aes(x = year, y = value)) +
  geom_line() +
  scale_y_continuous(labels = dt$label, breaks = dt$value) + 
  geom_text_repel(
    # removed `dt$` from `dt$label`
    aes(label = label),
    # filter/change the data ggplot knows, effective for just this geom
    data = ~ .x[, .SD[1,], .(label, rleid(label))]
  )

在绘图空间内,ggplot 所知的核心数据将替换 .xdata = ~ .x[...]

带有每个变化事件一个条目的 ggplot 代码

(一个小小的注意事项:rleid 的使用假设数据在帧内是有序的。如果不能保证这一点,可以通过强制排序或采用其他一些方法来实现。)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章