ggplot 线条的选择性标签

3

总体目标:使用ggplot仅选择性地标记最后一个数据点在特定y值以上的线条。

可能的函数/包:我知道geom_text()函数和directlabels包,但我无法在它们的文档中找到像上述那样有选择性地标记线条的方法。

示例数据:

ID <- c(rep("ID1", 5), rep("ID2", 5), rep("ID3", 5), rep("ID4", 5), rep("ID5", 5))
Y <- c(1, 2, 3, 4, 5, 
       10, 20, 30, 40, 1, 
       5, 10, 15, 10, 60, 
       50, 30, 20, 25, 10,
       20, 25, 30, 35, 50)
Year <- c(rep(seq(2000 ,2004), 5))
DATA <- data.frame(ID, Year, Y)

绘制数据

ggplot(data=DATA, aes(Year, Y)) + 
  geom_line(aes(y=Y, x=Year, color=ID)) + 
  theme_bw()

情节

问题

对于上面的情节,是否有一种方法可以使用gg_text()、directlabels或任何其他函数按照其ID自动(而不是手动)标记仅其最后一个点为Y >= 50(紫色和绿色线)的线条?

非常感谢您的帮助!


2
仅凭我的经验,你似乎知道如何标记每一行。从那里开始倒推。将ID列复制到某个新变量中。修改该新列,使您不想标记的所有行都具有空白“”或NA值。然后,也许当您使用该列构建标签时,只有您想要的标签会显示出来。 - joran
2个回答

4

如果您希望添加标签,可以通过过滤数据来获取适当的标签位置。例如:

ggplot(data=DATA, aes(Year, Y, color=ID)) + 
  geom_line() + 
  geom_text(data=DATA %>% group_by(ID) %>% 
              arrange(desc(Year)) %>% 
              slice(1) %>% 
              filter(Y >= 50),
            aes(x = Year + 0.03, label=ID), hjust=0) +
  theme_bw() +
  guides(colour=FALSE) +
  expand_limits(x = max(DATA$Year) + 0.03)

enter image description here


谢谢你的回答!我喜欢标签与线条颜色相匹配的设计。 - firebird17139
1
不错!稍微更像dplyr的方法是使用top_n(1, Year) %>%而不是arrange(desc(Year)) %>% slice(1) %>% - Andrew Lavers
如果其他人对此解决方案感兴趣,我想补充一下,当然,在筛选函数中也可以添加其他条件,以防它在其他地方捕捉到任何 Y >= 50 的点。例如,您可以使用 filter(Y >= 50 & Year == 2003) 只选择每条线上最右边的点。 - firebird17139

3

最简单的方法是根据条件将标签添加到数据框中,然后绘制图表。

library(tidyverse)
DATA %>% 
  mutate(label = ifelse(Y >= 50 & Year == max(Year), ID, NA)) %>%
  ggplot(aes(Year, Y)) + 
    geom_line(aes(color = ID)) + 
    geom_text(aes(label = label))

enter image description here


我没有考虑过mutate命令。谢谢你的帮助! - firebird17139

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接