2011-12-06 9 views
6

Zastanawiam się, czy możliwe jest caclulate obszar w obrębie konturu w R.Jak mogę obliczyć obszar wewnątrz konturu w R?

Na przykład, obszar konturu, która wynika z:

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) 

Niestety, wiem, że ten kod może być zawiłym. Jeśli jest zbyt trudne do odczytania. Dowolny przykład, w którym możesz pokazać mi, jak obliczyć obszar prostego generowanego konturu, byłby pomocny.

Dzięki za pomoc.

+1

Masz na myśli obszar * w obrębie * konturu? – Phonon

+0

Jak zdefiniowany jest kontur (przykład) ... jaki obszar chcesz? Jeśli masz współrzędne granic, to jest stosunkowo łatwe. – John

+0

Tak. Obszar w obrębie konturu. @John: Zamienię przykład na moje oryginalne pytanie. –

Odpowiedz

5

Dzięki @DWin dla powtarzalnego przykład i autorów sos (mój ulubiony pakiet R!) I splancs ...

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

Pobiera samą odpowiedź jak @DWin, co jest pocieszające. (Prawdopodobnie jest to ten sam algorytm, ale implementowany w ramach procedury Fortran w pakiecie splancs ...)

+2

Nie zasługuję na duży kredyt, ponieważ po prostu wszedłem na stronę 'help (contourlInes)' i złapałem tam przykład. @BurtonGuster powinien czuć się swobodnie, aby dać Benowi znacznik wyboru. Prawdopodobnie powinienem przekazać Benowi kilka tysięcy punktów za całą dobrą pracę, którą opublikował tutaj i na liście mailingowej R-help. Podobnie jak Hadley i Gabor Grothendeick –

+0

Zgadzam się z @DWinem – Andrie

+0

@DWin and Ben: Dzięki za pomoc! –

6

Zakładam, że pracujesz z obiektem zwróconym przez linie konturów. (Nienazwana lista z komponentami x i y na każdym poziomie). Spodziewałem się znaleźć to w łatwo dostępnym miejscu, ale zamiast tego znalazłem plik PDF, który dostarczył algorytm, który niejasno pamiętam, widząc http://finzi.psych.upenn.edu/R/library/PBSmapping/doc/PBSmapping-UG.pdf (Patrz pdf strona 19, oznaczona etykietą " -11- ") (Dodano uwaga: Wikipedia article on "wielokąt" przytacza tę dyskusję o wzorze inspektorów: http://www.maa.org/pubs/Calc_articles/ma063.pdf, co uzasadnia stosowanie mój abs()).

Budowanie przykład:

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 

Obszar na poziomie == 130 (wybrany, ponieważ nie ma dwóch 130 poziomów i nie spełnia żadnej z granic działki) to:

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