当该点超出 ggplot in r 中 x 轴刻度的限制时,尾随 geom_segment 行

trailing geom_segment lines when the point falls out of the limits of the x-axis scale in ggplot in r

我有两个长格式和宽格式的数据帧,下面是一个示例:

df_longer <- data.frame(list(Name = c("A", "A", "A", "A", "A", 
                                     "B", "B", "B", "B", "B"), 
                            Date_Types = c("Date1", "Date2", 
                                     "Date3","Date4", "Date5", 
                                     "Date1", "Date2", "Date3", 
                                     "Date4", "Date5"), Dates = 
                              structure(c(18903, 18965, 19081, 
                                     19116, 19172, 19083, 19097, 
                                     19219, 19249, 19341), class = 
                                 "Date")))

df_wider <- data.frame(list(Name = c("B", "A"), Date1 = structure(
  c(19083, 18903), class = "Date"), Date2 = structure(c(19097, 
    18965), class = "Date"), Date3 = structure(c(19219, 19081), 
            class = "Date"), Date4 = structure(c(19249, 19116), 
            class = "Date"), Date5 = structure(c(19341, 19172), 
            class = "Date")))

我试图在限制 geom_segment 线的情况下绘制数据。

my_date_format <- function()
{
   function(x)
   {
       m <- format(x,"%b")
       y <- format(x,"%Y")
       ifelse(duplicated(y),m,paste(m,y))
   }
}

ggplot(df_longer, aes(x = Dates, y = Name)) + 
  theme_classic() + geom_point(aes(shapes = Date_Types), size=8) +
  theme(axis.line.y = element_blank(), 
        axis.ticks = element_blank(),
        axis.title = element_blank(), 
        axis.text = element_text(size=22)) +
  scale_x_date(date_break = "1 month", 
               labels = my_date_format()) +
  geom_segment(data=df_wider, aes(x=Date1, xend=Date2,
  y=Name, yend=Name), size=0.6, linetype="dashed") +
  geom_segment(data=df_wider, aes(x=Date2, xend=Date3,
  y=Name, yend=Name), size=0.6, linetype="dashed") +
  geom_segment(data=df_wider, aes(x=Date3, xend=Date4,
  y=Name, yend=Name), size=1) +
  geom_segment(data=df_wider, aes(x=Date4, xend=Date5,
  y=Name, yend=Name), size=0.6, linetype="dashed")

即使开始日期或结束日期不在此处的限制范围内,我也想保留离开绘图区域的 geom_segment 行:

  scale_x_date(date_break = "1 month", 
               labels = my_date_format(),
               limits = as.Date(c('2021-11-11','2022-11-11'))) + ...

所需的输出将是:

添加 geom coord_cartesian() 是我的首选方法。

ggplot(df_longer, aes(x = Dates, y = Name)) + 
  theme_classic() + geom_point(aes(shapes = Date_Types), size=8) +
  theme(axis.line.y = element_blank(), 
        axis.ticks = element_blank(),
        axis.title = element_blank(), 
        axis.text = element_text(size=22)) +
  scale_x_date(date_break = "1 month", 
               labels = my_date_format()) +
  coord_cartesian(xlim = as.Date(c('2021-11-11','2022-11-11'))) +
  geom_segment(data=df_wider, aes(x=Date1, xend=Date2,
                                  y=Name, yend=Name), size=0.6, linetype="dashed") +
  geom_segment(data=df_wider, aes(x=Date2, xend=Date3,
                                  y=Name, yend=Name), size=0.6, linetype="dashed") +
  geom_segment(data=df_wider, aes(x=Date3, xend=Date4,
                                  y=Name, yend=Name), size=1) +
  geom_segment(data=df_wider, aes(x=Date4, xend=Date5,
                                  y=Name, yend=Name), size=0.6, linetype="dashed")

制作中