add x=y line to scatterplot

line, plot, r, scatter-plot

Solution

This is actually fairly difficult/hackish, because `scatterplot()` internally uses `layout`, which makes it hard to control the subplot currently being used by the graphics driver. (Update: it's harder than I thought -- setting `par("mfg")` must have been working more or less by accident.)

Make up data (update: using data with mean x and y not equal zero and not equal to each other, as it illustrate the difficulties of naively using `abline()` more clearly)

set.seed(1)
d <- data.frame(x=rnorm(10,mean=10),y=rnorm(10,mean=12))
library(car)

Try my old strategy (which doesn't actually work, or works only unpredictably):

scatterplot(y~x,data=d,reset.par=FALSE)
k <- 1              
for (i in 1:2) {
   for (j in 1:2) {
      par(mfg=c(i,j,2,2))
        abline(0,1,lwd=3,col=k)
        k <- k+1
  }

}

Depending on how I do this, I either get warnings and errors or bogus answers. It seems to matter whether I do the `scatterplot()` call inside a function ... ??

Second try, more conservatively: reconstruct layout from scratch.

 scatterplot(y~x,data=d)
 uu <- par("usr")
 ## mimic layout frolm car:::scatterplot.default.  Would be different if we were drawing only one
 ## of x-boxes or y-boxes
 layout(matrix(c(1, 0, 3, 2), 2, 2), widths = c(5, 95), 
        heights = c(95, 5))
 oldmar <- par(mar=rep(0,4))  ## zero out margins so we can plot in sub-boxes without errors
 ## now skip through the first two sub-plots
 par(new=TRUE); plot.new(); par(new=TRUE); plot.new()
 par(oldmar)  ## reset margins
 ## blank plot with user limits set and 'interior' axis calculations
 plot(0:1,0:1,xlab="",ylab="",xlim=uu[1:2],ylim=uu[3:4],xaxs="i",yaxs="i")
 ## add annotation
 abline(a=0,b=1,col=4,lwd=3)              

Given the amount of effort and fragility of this solution, it might actually be best to hack `scatterplot` to optionally allow `abline()` to be specified additionally, or to ask the maintainer for that capability ...

Problem

I am using the scatterplot function from the car package to generate a scatterplot. I want to be able to generate a reference line in the plot that should be x=y. I tried using abline and it does add a line but it is not the x=y line. Can someone help? My code is as follows: ``` scatterplot(phenos$P1~pheno$P0, data=pheno,spread=FALSE,ylab="6 month timepoint", xlab="Baseline Timepoint", jitter=list(x=1, y=1)) abline(0,1) ``` Thanks.

Original source