Skip to content
Prev 157117 / 398506 Next

Changing a plot

R Help wrote:
Hi Sam,
An interesting question. Here's a way to erase a point while redrawing 
any points within a certain proportion of the plot extent. It wouldn't 
be hard to extend this to draw a new point somewhere else if you wanted 
it all in one function.

erase.point<-function(x,y,pch=1,col=par("fg"),cex=1,tol=0.02*cex,
 erase.index,erase.pch=1,erase.col=par("bg"),erase.cex=1) {
 
 # erase the point
 points(x[erase.index],y[erase.index],pch=pch,col=erase.col,cex=1.1*erase.cex)
 # repeat the point parameters so that they can be indexed
 if(length(pch) < length(x)) pch<-rep(pch,length.out=length(x))
 if(length(col) < length(x)) col<-rep(col,length.out=length(x))
 if(length(cex) < length(x)) cex<-rep(cex,length.out=length(x))
 # work out the x and y differences within which the remaining points
 # will be redrawn
 xylim<-par("usr")
 xtol<-diff(xylim[1:2])*tol
 ytol<-diff(xylim[3:4])*tol
 for(i in 1:length(x)) {
  if(i != erase.index) {
   # if this point is within the specified tolerance, redraw it
   if(abs(x[i]-x[erase.index]) < xtol && abs(y[i]-y[erase.index]) < ytol)
    points(x[i],y[i],pch=pch[i],col=col[i],cex=cex[i])
  }
 }
}

x = rnorm(100,1,0.5)
y = rnorm(100,1,0.5)
plot(x,y,pch=16)
points(x[35],y[35],pch=19,col=6,cex=3)
erase.point(x,y,pch=19,erase.index=35,erase.pch=19,erase.col="white",erase.cex=3)

Jim