rdataframeggplot2annotategeom-vline

Dynamic vlines and annotations on ggplot


I was wondering if it's possible to dynamically generate geom_vlines and annotations for a ggplot based on the contents of another dataframe.

I currently have a dataframe of the following structure, which I use to plot a time-series:

 $ Date : Date, format: "2021-07-02" "2021-07-05" "2021-07-06" "2021-07-07" ...
 $ type : chr  "25 25" "25 25" "25 25" "25 25" ...
 $ dec     : num  -0.193 -0.189 -0.176 -0.195 -0.219

I then use that df to plot a chart:

ggplot(df)+geom_line(aes(x=Date, y=type, color=dec))+geom_point(aes(x=Date, y=dec, color=type))+
  geom_hline(yintercept = 0)+geom_vline(xintercept = as.numeric(ymd("2022-08-25")), linetype="dashed", color = "red")+
  geom_vline(xintercept = as.numeric(ymd("2022-07-19")), linetype="dashed", color = "red")+geom_vline(xintercept = as.numeric(ymd("2022-04-19")), linetype="dashed", color = "red")+annotate(x=as.Date(ymd("2022-08-25")), y=+Inf,vjust=1,hjust=2.1,size=3,label="25/08/22 No:1.6", geom="text", angle=90)+
  annotate(x=as.Date(ymd("2022-07-19")), y=+Inf,vjust=1,hjust=2.1,size=3,label="19/07/22 No:2.1", geom="text", angle=90)+annotate(x=as.Date(ymd("2022-04-19")), y=+Inf,vjust=1,hjust=2,size=3,label="19/04/22 No:2.4", geom="text", angle=90)

I currently have to enter both the geom_vlines and corresponding annotations manually, and it's becoming an increasingly unwieldy exercise to complete if a lot of annotations are necessary. I was wondering if it would be possible to dynamically generate these annotations and vlines from another dataframe?

I've been to source and tidy-up this data, and now have it in a dataframe like this:

$ Date     : Date, format: "2022-08-25" "2022-07-19" "2022-04-19" ...
$ Amount  : num  1.6 2.4 2.1 ...

Realise it may be a bit 'out there' but any advice/assistance is greatly appreciated.


Solution

  • With thanks to Jon Spring, it's now working as intended. Using:

    ggplot(df)+geom_line(aes(x=Date, y=type, color=dec))+geom_point(aes(x=Date, y=dec, color=type))+
      geom_hline(yintercept = 0)+
      geom_vline(data = df2, aes(xintercept = Date), linetype="dashed", color = "red")+geom_text(data = df2, aes(x = Date, y = Inf, label = Date), vjust=1,hjust=2.1,size=3,angle=90)