2015-07-13 65 views
0

我有一個locfit模型的立體圖和我想兩件事情在三維空間 添加點和彩色表面locfit角度情節

  • 顏色的表面添加到它

    1. 預測變量爲點根據Z軸的值

    對於第一個,我試圖使用trans3d函數。但我得到以下錯誤,即使我的變量是矢量格式:

    錯誤cbind(X,Y,Z,1)%*%PMAT:需要數字/複雜的矩陣/矢量參數

    這裏是我的代碼片段

    library(locfit)  
        X <- as.matrix(loc1[,1:2]) 
        Y <- as.matrix(loc1[,3]) 
        zz <- locfit(Y~X,kern="bisq") 
        pmat <- plot(zz,type="persp",zlab="Amount",xlab="",ylab="",main="Plains", 
         phi = 30, theta = 30, ticktype="detailed") 
    
        x1 <- as.vector(X[,1]) 
        x2 <- as.vector(X[,2]) 
        Y <- as.vector(Y) 
        points(trans3d(x1,x2,Y,pmat)) 
    

    我 「LOC1」 數據可以在這裏找到 - https://www.dropbox.com/s/0kdpd5hxsywnvu2/loc1_amountfreq.txt?dl=0

  • +0

    什麼是 「LOC1」 對象?另外,請添加您使用的額外包裹。 – 2015-07-13 03:22:53

    +0

    @Pascal我已經添加了鏈接到我的數據以及我使用的額外軟件包 – dustbunny

    +0

    當您說「預測變量作爲3D空間中的點」時,您的意思是您還希望繪製原始數據(每個點都有一個點) ? –

    回答

    0

    TL,DR:沒有真正plot.locfit,但你可以重建它。

    我不認爲plot.locfit有很好的支持這種定製。假設get.data=T在您的plot調用中將繪製原始數據點(點1),並且似乎確實如此,如果type="persp"。所以沒有運氣。或者,您可以像points(trans3d(...))那樣完成,除非您需要由persp返回的透視矩陣,並且plot.locfit.3d不會返回它。所以再次,沒有運氣。

    對於着色,通常您會製作一個色階(http://r.789695.n4.nabble.com/colour-by-z-value-persp-in-raster-package-td4428254.html)併爲每個z構面指定與之相關的顏色。但是,您需要此表面的Z值(而不是原始數據的Z值),並且plot.locfit也不會返回此值。

    所以要做你想做的事情,你本質上應該自己記錄plot.locfit(不難,雖然只是cludgy)。

    你可以把它放到一個函數中,以便重用它。 我們:

    1. 使XY點的均勻格柵
    2. 在每個點
    3. 使用這些繪製表面(具有色標)計算擬合的值,保存該立體矩陣,使得我們可以
    4. 情節的原始數據

    這樣:

    # make a grid of x and y coords, calculate the fit at those points 
    n.x <- 20 # number of x points in the x-y grid 
    n.y <- 30 # number of y points in the x-y grid 
    zz <- locfit(Total ~ Mex_Freq + Cal_Freq, data=loc1, kern="bisq") 
    xs <- with(loc1, seq(min(Mex_Freq), max(Mex_Freq), length.out=20)) 
    ys <- with(loc1, seq(min(Cal_Freq), max(Cal_Freq), length.out=30)) 
    xys <- expand.grid(Mex_Freq=xs, Cal_Freq=ys) 
    zs <- matrix(predict(zz, xys), nrow=length(xs)) 
    
    # generate a colour scale 
    n.cols <- 100 # number of colours 
    palette <- colorRampPalette(c('blue', 'green'))(n.cols) # from blue to green 
    # palette <- colorRampPalette(c(rgb(0,0,1,.8), rgb(0,1,0,.8)), alpha=T)(n.cols) # if you want transparency for example 
    # work out which colour each z-value should be in by splitting it 
    # up into n.cols bins 
    facetcol <- cut(zs, n.cols) 
    
    # draw surface, with colours (col=...) 
    pmat <- persp(x=xs, y=ys, zs, theta=30, phi=30, ticktype='detailed', main="plains", xlab="", ylab="", zlab="Amount", col=palette[facetcol]) 
    
    # draw your original data 
    with(loc1, points(trans3d(Mex_Freq,Cal_Freq,Total,pmat), pch=20)) 
    

    注 - 看起來不漂亮!可能會想要調整說你的顏色比例顏色,或方面的透明度等。Re:添加圖例,有一些other questions處理。

    enter image description here

    (PS:真可惜ggplot沒有做3D散點圖。)