R ggplot线的选择性标记
一般目标:使用ggplot仅选择性地标记最后一个点高于某个y值的线 潜在函数/包:我知道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,
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命令。谢谢你的帮助!