2011-12-06 21 views
6

Me pregunto si es posible caclulate el área dentro de un contorno en R.¿Cómo puedo calcular el área dentro de un contorno en R?

Por ejemplo, la zona del contorno que resulta de:

sw<-loess(m~l+d) 
mypredict<-predict(sw, fitdata) # Where fitdata is a data.frame of an x and y matrix 

contour(x=seq(from=-2, to=2, length=30), y=seq(from=0, to=5, length=30), z=mypredict) 

siento, sé que este código podría ser intrincado Si es demasiado difícil de leer Cualquier ejemplo en el que pueda mostrarme cómo calcular el área de un contorno generado simplemente sería útil.

Gracias por cualquier ayuda.

+1

¿Se refiere al área * dentro de * un contorno? – Phonon

+0

¿Cómo se define el contorno (un ejemplo) ... qué área quiere? Si tienes coordenadas de un límite, es relativamente fácil. – John

+0

Sí. El área dentro de un contorno. @John: voy a editar un ejemplo en mi pregunta original. –

Respuesta

5

Gracias a @DWin por ejemplo reproducibles, ya los autores de sos (mi favorito paquete de R!) Y splancs ...

library(sos) 
findFn("area polygon compute") 
library(splancs) 
with(clines[[9]],areapl(cbind(x,y))) 

recibe la misma respuesta como @DWin, que es reconfortante. (Presumiblemente es el mismo algoritmo, pero implementado dentro de una rutina Fortran en el paquete splancs ...)

+2

No merezco mucho crédito ya que acabo de ir a la página 'help (contourlInes)' y tomé el ejemplo allí. @BurtonGuster debe sentirse en libertad de darle a Ben la marca de verificación. Probablemente debería donar algunos miles de puntos a Ben por todo el buen trabajo que ha publicado aquí y en la lista de correo de ayuda de R. Del mismo modo a Hadley y Gabor Grothendeick –

+0

Estoy de acuerdo con @DWin – Andrie

+0

@DWin y Ben: ¡Gracias por la ayuda! –

6

Supongo que está trabajando con un objeto devuelto por contourLines. (Una lista sin nombre con componentes xey en cada nivel.) Esperaba encontrar esto en una ubicación de fácil acceso, pero encontré un archivo pdf que me proporcionó un algoritmo que recuerdo vagamente haber visto http://finzi.psych.upenn.edu/R/library/PBSmapping/doc/PBSmapping-UG.pdf (Ver la página 19 en PDF, etiquetado " -11- ") (Se agregó una nota: El artículo de Wikipedia sobre "polígono" cita este discusión de la fórmula de Aparejadores: http://www.maa.org/pubs/Calc_articles/ma063.pdf, lo que justifica mi uso de abs()).

La construcción de un ejemplo:

x <- 10*1:nrow(volcano) 
y <- 10*1:ncol(volcano) 
contour(x, y, volcano); 
clines <- contourLines(x, y, volcano) 
x <- clines[[9]][["x"]] 
y <- clines[[9]][["y"]] 
level <- clines[[9]][["level"]] 
level 
#[1] 130 

El área en el nivel == 130 (elegido porque no hay dos niveles 130 y no cumple con ninguno de los límites de la trama) es entonces:

A = 0.5* abs(sum(x[1:(length(x)-1)]*y[2:length(x)] - y[1:(length(x)-1)]*x[2:length(x)])) 
A 
#[1] 233542.1 
Cuestiones relacionadas