Home > Mobile >  Add extra tick where vertical line crosses x-axis
Add extra tick where vertical line crosses x-axis

Time:10-17

I have below ggplot

library(ggplot2)
library(quantmod)
dat = data.frame(val = 1:20, qtr = as.yearqtr(seq(as.Date('2000-01-01'), length.out = 20, by = '3 months')))

ggplot(data = dat)  
  geom_line(aes(x = qtr, y = val))  
  geom_vline(xintercept = as.yearqtr(as.Date('2003-04-01')))

I want to add one extra tick in x-axis where my vertical line crosses the x-axis. The corresponding tick label will also be manual i.e. 'Sep : 2003-04-01'. Is there any function available in ggplot to achieve this?

Thanks for your help.

CodePudding user response:

You could define your bespoke date breaks as a separate vector.
And the labels as a matching text vector including the bespoke text for the x intercept tick.
Adjustments to the axis text for legibility.

library(ggplot2)
library(quantmod)

intercept_date <- as.yearqtr(as.Date('2003-04-01'))

x_breaks <- c(as.yearqtr(seq(as.Date('2000-01-01'), length.out = 5, by = '12 months')), intercept_date)
x_labels <- c(as.character(as.yearqtr(seq(as.Date('2000-01-01'), length.out = 5, by = '12 months'))), "Sep : 2003-04-01")

ggplot(data = dat)  
  geom_line(aes(x = qtr, y = val))  
  geom_vline(xintercept = intercept_date) 
  scale_x_yearqtr(breaks = x_breaks,
                     labels = x_labels) 
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

Created on 2022-10-16 with reprex v2.0.2

  • Option 2

In response to comment: intercept breaks and labels defined within scale_x_yearqtr:


ggplot(data = dat)  
  geom_line(aes(x = qtr, y = val))  
  geom_vline(xintercept = as.yearqtr(as.Date('2003-04-01'))) 
  scale_x_yearqtr(breaks = c(as.yearqtr(seq(as.Date('2000-01-01'), length.out = 5, by = '12 months')), as.yearqtr(as.Date('2003-04-01'))),
                  labels = c(as.character(as.yearqtr(seq(as.Date('2000-01-01'), length.out = 5, by = '12 months'))), "Sep : 2003-04-01")) 
  theme(axis.text.x = element_text(angle = 30, hjust = 1))

  • Related