Hello list, I've been working on this problem for a while and I haven't been able to come up with a solution. I have a couple of functions that plot a bunch of data, then a single point on top of it. What I want is to be able to change the plot of the point without replotting all the data. Consider the following example: 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) What I want to be able to do is to change the purple point to a different value without replotting everything. I know this seems like an odd suggestion, but it comes up a lot with the work I'm doing. I've prepared a package on CRAN called ResearchMethods for a course I'm working on, and there are several functions in there who's GUIs could work better if I could figure this out. If anyone has any ideas, or needs some further explanation, feel free to contact me. Thanks a lot, Sam Stewart
R Help <rhelp.stats <at> gmail.com> writes:> > Hello list, > > I've been working on this problem for a while and I haven't been able > to come up with a solution. > > I have a couple of functions that plot a bunch of data, then a single > point on top of it. What I want is to be able to change the plot of > the point without replotting all the data. Consider the following > example: > > 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) > > What I want to be able to do is to change the purple point to a > different value without replotting everything. >R's default (base) graphics model is a 'canvas' -- things get drawn, but nothing ever gets erased. (The cheap solution is to overplot in the background color, but that won't work if there's stuff underneath the point that you want to preserve.) You probably need to move to the grid graphics package (hint: buy or borrow Paul Murrell's book) to do something like this. Ben Bolker
One way is to keep a copy of the original and then return to it when you need it. x <- rnorm(100,1,0.5) y <- rnorm(100,1,0.5) plot(x,y,pch=16) original <- recordPlot() for( i in 1:10 ){ points( x[i], y[i], pch=19, col="yellow", cex=3) points( x[i], y[i], pch=16) Sys.sleep(1) # slow the graphs a bit replayPlot(original) } Regards, Adai R Help wrote:> Hello list, > > I've been working on this problem for a while and I haven't been able > to come up with a solution. > > I have a couple of functions that plot a bunch of data, then a single > point on top of it. What I want is to be able to change the plot of > the point without replotting all the data. Consider the following > example: > > 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) > > What I want to be able to do is to change the purple point to a > different value without replotting everything. > > I know this seems like an odd suggestion, but it comes up a lot with > the work I'm doing. I've prepared a package on CRAN called > ResearchMethods for a course I'm working on, and there are several > functions in there who's GUIs could work better if I could figure this > out. > > If anyone has any ideas, or needs some further explanation, feel free > to contact me. > > Thanks a lot, > Sam Stewart > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
R Help wrote:> Hello list, > > I've been working on this problem for a while and I haven't been able > to come up with a solution. > > I have a couple of functions that plot a bunch of data, then a single > point on top of it. What I want is to be able to change the plot of > the point without replotting all the data. Consider the following > example: > > 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) > > What I want to be able to do is to change the purple point to a > different value without replotting everything. > > I know this seems like an odd suggestion, but it comes up a lot with > the work I'm doing. I've prepared a package on CRAN called > ResearchMethods for a course I'm working on, and there are several > functions in there who's GUIs could work better if I could figure this > out. > > If anyone has any ideas, or needs some further explanation, feel free > to contact me. >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