R ggplot线的选择性标记

R ggplot线的选择性标记,r,plot,ggplot2,label,line-plot,R,Plot,Ggplot2,Label,Line Plot,一般目标:使用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,

一般目标:使用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
(紫色和绿色线)的线


非常感谢你的帮助

最容易根据条件将标签添加到数据框中,然后打印

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))

如果您愿意,可以通过过滤数据以获得适当的标签位置,动态添加标签。例如:

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)

我简直想不起来:你似乎知道如何标记每一行。从那往后退。将ID列复制到某个新变量中。修改该新列,使您不希望标记的所有行都有一个空白“”或NA值。然后,当你使用该列创建标签时,可能只有你想要的标签才会显示一些内容。谢谢你的回答!我喜欢标签与这里的线条颜色匹配!更像dplyr的是使用
top_n(1,Year)%%>%
而不是
arrange(desc(Year))%%>%slice(1)%%>%
如果其他人对此解决方案感兴趣,我会补充说,当然,您也可以向过滤器函数添加附加条件,以防它在
Y>=50的其他地方拾取任何点。例如,您可以使用
filter(Y>=50&Year==2003)
仅拾取每行上最右边的点。我没有考虑mutate命令。谢谢你的帮助!