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

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

先行致谢!
可复现的代码:
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 所知的核心数据将替换 .x 的 data = ~ .x[...]。
(一个小小的注意事项:rleid 的使用假设数据在帧内是有序的。如果不能保证这一点,可以通过强制排序或采用其他一些方法来实现。)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。
