ggplot日期轴截断为两个分面 跨分面显示横线且仅左侧标注标签的实现
ggplot分面控制标注仅在单个分面显示的解决方案
该需求完全可以实现,核心逻辑如下:
- 你当前使用的
annotate()属于全局标注函数,默认会在所有分面同步渲染,因此两个分面都会出现Normal Limit标签 - 要实现仅在单个分面显示标注,只需改用
geom_label(),传入专门的标注数据并绑定对应分面的bin值即可
完整可运行代码
首先提前加载依赖包:
library(tidyverse) library(lubridate)
修改后代码(仅替换了原annotate部分,其余逻辑完全保留):
df <- data %>% filter((Date >= dmy("25/03/2011") & Date <= dmy("18/05/2012")) | (Date >= dmy("18/07/2019") & Date <= dmy("28/04/2020"))) %>% mutate(bin = Date >= dmy("18/07/2019")) plot <- ggplot(df, aes(Date, Result))+ geom_point(colour = "red3", size = 2.5)+ geom_line(colour= "purple4", size = 1)+ facet_wrap(bin ~ ., scale = 'free_x')+ scale_x_date(date_labels = "%b %Y", guide = guide_axis(angle = 45), date_breaks = "2 months")+ scale_y_continuous(breaks = seq(0,6.2, by=0.5))+ theme(strip.text.x = element_blank())+ geom_vline(xintercept = dmy("29/8/2011"), linetype="dashed", color = "black", size=1)+ geom_vline(xintercept = dmy("26/1/2012"), linetype="longdash", color = "black", size=1)+ geom_vline(xintercept = dmy("16/9/19"), linetype="dashed", color = "black", size=1)+ geom_vline(xintercept = dmy("7/11/19"), linetype="longdash", color = "black", size=1)+ geom_hline(yintercept =0.4, linetype="dotted", color = "black", size=1)+ # 仅在bin=FALSE的左侧分面显示标注 geom_label(data = tibble(x = dmy("01/5/11"), y = 0.4, label = "Normal Limit", bin = FALSE), aes(x = x, y = y, label = label), vjust = -0.2)
提示:参数
vjust = -0.2是为了让标签显示在虚线上方避免遮挡,可根据实际显示效果调整数值。
运行代码后,0.4的水平虚线会保留在两个分面中,Normal Limit标签仅会出现在左侧第一个分面,完全符合预期效果。
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

