2013-11-22 67 views
0

我正在使用kde2dpersp繪製兩個變量x和y的密度密度。R:二維密度圖中的不同顏色取決於x和y的值

我怎樣才能做到以下幾點:

1)根據x和y的值,我想不同的顏色的情節。即對於值x> .5和y> .5,顏色應該是藍色,對於x < = .5和y < = .5,顏色應該是紅色。目前整個圖形只是藍色(見下面的代碼)。

2)如何着色表面以下的區域(即概率質量)?我想分別用藍色和紅色着色。

library(MASS) 
    i<-1 
    x<-NULL 
    y<-NULL 
    while (i<=30) { 
     x1 <- rnorm(1, 0, 1) 
     x2 <- rnorm(1, 0, 1) 
     x <- c(x, x1) 
     y<-c(y,x2) 
     i<-i+1 
    } 
    den3d <- kde2d(x, y) 
    persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", shade = 0.1, col = "blue", box=TRUE) 

幫助表示讚賞。

+0

請將'while'循環改爲'x < - rnorm(30); y < - rnorm(30)'。它冒犯了我的感情。你不應該像這樣在一個循環中增長一個對象,並且要記住,大多數R函數都是向量化的。 – Roland

回答

1

這回答第一個問題:

x <- rnorm(30) 
y <- rnorm(30) 

library(MASS) 
den3d <- kde2d(x, y) 

cols <- c("blue", "red")[(outer(na.omit(filter(den3d$x>0.5,c(1,1), sides=1)), 
           na.omit(filter(den3d$y>0.5,c(1,1), sides=1)), 
           "+")==4) + 1] 

persp(den3d,xlab="Var1", ylab="Var2", zlab="Density", 
     shade = 0.1, col = cols, box=TRUE, phi=90) 

enter image description here

注意,一個小面僅紅色如果它的x和y的值都>在整個面的範圍0.5。

我不認爲你應該做你在第二個問題中描述的內容。無論如何,persp不是爲此設計的。

編輯:這是怎麼回事?

den3d$x是繪圖的x值。如果兩端的x值大於0.5,我們需要檢查每個方面。我們可以通過計算這些值的總和來做到這一點。這可以使用filter進行(見help("filter")對於文件):

filter(den3d$x>0.5,c(1,1), sides=1) 
#[1] NA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 2 2 2 2 

邏輯輸入值通過filter自動強制爲0和1。所得值爲0表示在所有末端都> 0.5,在1表示> 0.5在一端和2表示在兩端> 0.5。我們需要刪除NA

然後,我們對den3d$y也進行此操作,並計算外部和,這可能會導致0到4之間的值。0和4分別表示一個構面的所有四個邊界不是並且分別大於0.5。值1至3表示1至3邊框> 0.5。我們通過使用==將所有值4(我們想要着色爲「紅色」的那些)設置爲TRUE,並將其他值設置爲FALSE。因爲我們需要FALSE的值爲1和TRUE的值爲2,以便對顏色向量進行子集化,所以我們(自動)將邏輯值強制爲0和1,並將其加上1.

就是這樣。

+0

謝謝羅蘭。你能否簡要解釋你的解決方案。即(1)** filter **(2)中** c(1,1)**參數的用途是什麼以及**「+」)== 4)**在** outer * *有和(3)爲什麼+1被添加? – user3021506

+0

請參閱編輯。希望有所幫助。 – Roland

+0

**好極了!非常感謝。 – user3021506

相關問題