2

一般目标:使用 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 或任何其他函数来自动(而不是手动Y >= 50)根据它们的 ID 只标记最后一点是(紫色和绿色线)的线?

非常感谢你的帮助!

4

2 回答 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)

在此处输入图像描述

于 2018-03-22T21:55:18.503 回答
2

最容易根据条件将标签添加到数据框中,然后进行绘图。

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

在此处输入图像描述

于 2018-03-22T21:50:19.157 回答