servet cizmeli
2012-May-25 20:52 UTC
[R] Selecting with mouse the lines drawn by matplot()
Dear all, I have a dataset of spectral measurements of sunlight. One row for each different observation, one column for each spectral channel. I would like to select the spectral curves drawn with matplot() (I only know matplot() as a way of easily drawing them) with the help of the mouse and extract their row indexes : a=url("http://ekumen.homelinux.net/spectra.RData") load(a) matplot(lbd2, t(mySpectra), type="l",xlab="Wavelength [nm]",ylab="Radiance") I was hoping that identify() would work on such a graphic but unfortunately it does not. I tried to the "identify" function of the package playwith(), but still the same problem. I think I will have to write a function that does the job. But before that, I would like to have your opinions. What would be the easiest way of accomplishing this task? Thank you very much Best regards servet
On 25.05.2012 22:52, servet cizmeli wrote:> Dear all, > > I have a dataset of spectral measurements of sunlight. One row for each > different observation, one column for each spectral channel. > > I would like to select the spectral curves drawn with matplot() (I only > know matplot() as a way of easily drawing them) with the help of the > mouse and extract their row indexes : > > a=url("http://ekumen.homelinux.net/spectra.RData") > load(a) > matplot(lbd2, t(mySpectra), type="l",xlab="Wavelength > [nm]",ylab="Radiance") > > I was hoping that identify() would work on such a graphic but > unfortunately it does not. I tried to the "identify" function of the > package playwith(), but still the same problem. > > I think I will have to write a function that does the job. But before > that, I would like to have your opinions. What would be the easiest way > of accomplishing this task?Write a little function that makes use of locator(): Take its x position and calculate (by interpolation) the y location of all paths at this x position, then take the minimal distance. The idea in quick an dirty: mat_identify <- function(x, y, ...){ l <- locator(1) if(all(x <= l$x) || all(x >= l$x)) stop("not within data range") index <- max(which(x <= l$x)) f <- (l$x - x[index]) / diff(x[index+(0:1)]) yi <- f * (y[index+1,] - y[index,] ) + y[index,] result <- which.min(abs(yi-l$y)) lines(x, y[,result], lwd=2, col="red") text(l, label=rownames(y)[result]) result } matplot(lbd2, t(mySpectra), type="l",xlab="Wavelength [nm]",ylab="Radiance") mat_identify(lbd2, t(mySpectra)) Best, Uwe Ligges> Thank you very much > Best regards > servet > > ______________________________________________ > 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.