1 de agosto de 2011

Ver como abeja

Una amiga quería clasificar las flores de su planta preferida (véase infierno en Wikipedia) de acuerdo a cómo son vistas por las abejas. Las abejas tienen visión tricromática en verde-azul-ultravioleta, así que para reconstruir cómo ven se necesita un espectrómetro sensible al UV. De allí obtendremos datos con dos columnas: una especifica la longitud de onda en nanómetros y la restante la reflectancia del objeto (la proporción de luz emitida que es reflejada).

En este post reconstruyo en R obtener las coordenadas para utilizar el hexágono de color de Apis mellifera, uno de los modelos más usados de la visión en estos insectos, a partir de lo expuesto en Chittka y Kevan (2005). Este capítulo puede descargarse de la página personal del autor.
Para llevar a cabo esta rutina necesitarán guardar en un archivo los valores de la tabla 4.6 de ese capítulo. En mi caso lo hice utilizando como nombres de columna nm, uv, blue, green, D65 y Leaf. Además necesitan las mediciones del espectrómetro, entre los 300 y 700 nm.

El principal problema a resolver es que los valores tabulados de la sensibilidad de los receptores de color y la irradiancia de la luz del día se encuentran en intervalos de 5 nm, mientras que los intervalos de los espectros de las flores dependen del aparato que usemos para tomarlos (en el caso de mi amiga, 0.22 nm). Por lo tanto hay que realizar una interpolación para calcular los valores faltantes. Esto se puede hacer con approxfun del paquete stats. Los demás pasos son sencillos y se encuentran detallados en la bibliografía.

#FUNCION PARA CALCULAR COORDENADAS EN EL HEXÁGONO
#Los parámetros de esta función son AP, NM y REF
#AP es el marco de datos con la sensibilidad de los 3 
#receptores de la abeja, la irradiancia de la luz del día y 
#la reflectancia de una hoja verde típica
#NM es un vector con los nm tomados con el espectrómetro
#REF es un vector con es la reflectancia medida entre 0 y 1

hexagon.coor<-function(NM, REF, AP){
UVfun<-approxfun(AP$nm, AP$uv)
BLfun<-approxfun(AP$nm, AP$blue)
GRfun<-approxfun(AP$nm, AP$green)
D65fun<-approxfun(AP$nm, AP$D65)
LEAfun<-approxfun(AP$nm, AP$Leaf)
Ru<-1/sum(UVfun(NM)*D65fun(NM)*LEAfun(NM), na.rm=T)
Rb<-1/sum(BLfun(NM)*D65fun(NM)*LEAfun(NM), na.rm=T)
Rg<-1/sum(GRfun(NM)*D65fun(NM)*LEAfun(NM), na.rm=T)
Pu<-Ru*sum(UVfun(NM)*D65fun(NM)*REF, na.rm=T)
Pb<-Rb*sum(BLfun(NM)*D65fun(NM)*REF, na.rm=T)
Pg<-Rg*sum(GRfun(NM)*D65fun(NM)*REF, na.rm=T)
Eu<-Pu/(Pu+1)
Eb<-Pb/(Pb+1)
Eg<-Pg/(Pg+1)
Xh<-0.8667*(Eg-Eu)
Yh<-Eb-0.5*(Eg+Eu)
res<-cbind(Xh, Yh)
res}

Suponiendo que queremos aplicar esta función a un gran número de columnas, necesitaremos usar apply, especificando los parámetros fijos: NM y AP deben contener los datos ya especificados.

DAT<- …  #mediciones de reflectancia
res<-t(apply(X=DAT, MARGIN=2, FUN=hexagon.coor,  NM=…, AP=…))
res
 
#FUNCIÓN PARA GRAFICAR
hexagon.plot<-function(x, box="n", axes=F,...){
Xcor<-c(-0.8667, -0.866, 0, 0.8667, 0.8667, 0)
Ycor<-c(-0.5, 0.5, 1, 0.5, -0.5, -1)
plot(Xcor, Ycor, pch="", xlab="", ylab="", bty=box, axes=axes,
xlim=c(-1,1), ylim=c(-1.1,1.1))
polygon(Xcor, Ycor)
text(x=c(-0.95, 0, 0.95), y=c(-0.5, 1.1, -0.5),
labels=c("UV", "B", "G"))
points(x[,1],x[,2], ...)}

hexagon.plot(res)

El resultado final es un gráfico como el que se muestra abajo, donde la distancia indica el parecido entre dos colores, desde la percepción de Apis mellifera.



Referencia:
Chittka, L. & Kevan, P.G. (2005) Flower colour as advertisement. In Dafni, A., Kevan, P.G., Husband, B.C. (eds.) Practical Pollination Biology. EnviroquestLtd., Cambridge, ON, Canada, pp. 157 – 196.

 
Licencia Creative Commons
Este obra está bajo una licencia Creative Commons Atribución-NoComercial-CompartirIgual 2.5 Argentina.