2013-01-25 27 views
1

我需要找到從表面音量降低到一個特定的輪廓R.以從R幫助文件輪廓例如:量下降到R中的輪廓

x <- 10*1:nrow(volcano) 
y <- 10*1:ncol(volcano) 
contour(x,y,volcano) 

給出的產生圖,我如何從特定的等高線直到表面找到體積。

實際上,我將使用bkde2D來獲取散點圖的密度圖。由此我可以製作等高線圖,但是我想確定由所得圖中各種密度截止點定義的體積。

回答

1

功能contour只畫出輪廓線但不返回任何值。你需要使用的是功能contourLines

cL <- contourLines(x,y,volcano) 

從那裏,你可以計算出每個輪廓線的面積按以下方式:

area <- rep(0,length(cL)) 
for(i in 1:length(cL)){ 
    d <- data.frame(cL[[i]]$x,cL[[i]]$y) 
    sa <- sb <- 0 
    for(j in 1:(nrow(d)-1)){ 
     sa <- sa+d[j,1]*d[j+1,2] 
     sb <- sb+d[j,2]*d[j+1,1] 
     } 
    area[i] <- abs((sa-sb)/2) 
    } 
area 
[1] 1.413924e+05 3.109685e+04 2.431528e+04 2.049473e+04 6.705976e+04 3.202145e+05 1.720469e+03 
[8] 2.926802e+05 2.335421e+05 1.834791e+05 1.326162e+05 4.672784e+02 9.419792e+04 5.121851e+03 
[15] 5.126860e+04 3.660862e-01 1.216750e+03 2.051307e+04 4.670745e+02 4.146927e+03 

現在,如果你想兩個輪廓線之間的體積(水平120和130之間說的):

level1 <- 120 
level2 <- 130 
levels <- unlist(lapply(cL,function(x)x$level)) 
base <- (1:length(cL))[level==level1] 
top <- (1:length(cL))[level==level2] 
vol <- (level[top]-level[base])*(area[base]+area[top])/2 
vol 
[1] 2631111 

這就是我所能做的,因爲如果下一條輪廓線被分成幾個扇區,我不會看到如何進行。

+0

嘿,這是當輪廓線分裂,樂趣開始:-)。這或多或少是一個小心的問題,它打破了等高線的收集和計算每個子體積。 –

+0

嗯,我認爲大多數情況下我會處理密度的單峯,所以這可能不是這樣的問題。謝謝(你的)信息。 –