This is one of many ways such a thing might be done.
library(data.table)
library(janitor)
library(tidyverse)
library(magrittr)
x1 <- c(1,1.5,2.7,3,4.75,9,11,15,15.1,18)
x2 <- c(2,4,3,7,6,9.5,17,15.6,24,19)
# x3 <- c((x1+x2)/2)
df<- data.frame(x1=x1,
x2=x2) %>% arrange(x1,x2)
df$x3 <- (x1+x2)/2
df$lag_x1<- lag(df$x1)
df$lag_x2<- lag(df$x2)
df$clash <-between(df$x1,df$lag_x1,df$lag_x2) | between(df$x2,df$lag_x1,df$lag_x2)
df$height <- 1
for (i in seq_along(df$clash))
{
if(i>1){
if(df$clash[i])
df$height[i] <- 1+ max(df$height[i-1],0,na.rm = TRUE)
else
df$height[i]<-1
}
}
df
labs <- as.character(df$height)
colours = rep("red",length(df$height))
par(bg="azure")
plot_left_lim <- min(df$x1)
plot_right_lim <- max(df$x2)
plot.new()
plot.window(c(plot_left_lim,plot_right_lim),c(0,6))
axis(1, at=seq(plot_left_lim,plot_right_lim,0.1), cex.axis=0.5)
abline(v=seq(plot_left_lim,plot_right_lim,0.05),col="gray95",lty="dotted")
abline(v=seq(plot_left_lim,plot_right_lim,0.1),col="lightgrey",lty="dotted")
abline(v=seq(plot_left_lim,plot_right_lim,0.5),col="lightgrey",lty="dashed")
abline(v=seq(plot_left_lim,plot_right_lim,1),col="darkgrey")
segments(df$x1,df$height,df$x2,df$height,col=colours,lwd=10)
text(df$x3,df$height+.5,labs,cex=0.5,srt=-45)
title(main="Elution Times of Compounds on EO Basemethod 2020.M")
title(xlab="Elution Time in Minutes")
abline(v=plot_left_lim)
abline(v=plot_right_lim)
segments(plot_left_lim,6.25,plot_right_lim,6.25)