So what I had to do was use the segment() function to draw my lines. The only problem was that I needed the precise upper and lower coordinates to feed to the segment command. Even though in my case I used a user defined ylim (max and min of y), the plot adds a little bit of a fudge-factor to these upper and lower limits. Enter the usr command. My answer came in the form of this very useful R help posting. The usr option to par() returns a vector of the exact corner limit values of your plotting area (very handy!).
Here is another nice post about the ‘usr’ option to par.
Here’s how it all came together.
## model of my problem par(xpd=TRUE) x <- stats::runif(12); y <- stats::rnorm(12) i <- order(x, y); x <- x[i]; y <- y[i] plot(x, y, main = "Notice how the line extends beyond plot margins") abline(v=0.4) ## my solution par(xpd=TRUE) x <- stats::runif(12); y <- stats::rnorm(12) i <- order(x, y); x <- x[i]; y <- y[i] plot(x, y, main = "Notice how the line extends beyond plot margins") u <- par("usr") segments(0.4, u[3], 0.4, u[4])