Skip to content

Selecting with mouse the lines drawn by matplot()

2 messages · Servet Ahmet Çizmeli, Uwe Ligges

#
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:
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