You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:39:02