2015-02-07 156 views
2

我想複製像使用R,可能使用ggplot(儘管我懷疑它可能是AFAIK,它沒有3D功能)可能使用下面的情節。我擁有的數據通常是光柵包中的光柵文件,但我可以用最合適的格式進行轉換。 「氣候變化2013::物理科學基礎工作組對氣候變化政府間小組的第五次評估報告」,圖1.14繪製三維地形網格

情節取自。我不知道哪個軟件產生了這個陰謀。

我想唯一的是使用格::雲(線框)或類似的東西?我似乎無法找到任何方法來強制線框有indplot而不是曲面圖;此外,基於海上高度的網格保持水平的着色可能是不可能的。

+0

這將是工作的一個顯著量,但'rgl'包,當然可以言盡於此。看看'demo(「hist3d」,package =「rgl」)' – 2015-02-07 17:18:23

+0

同意@BenBolker。也許這是一個起點:http://spatial.ly/2013/05/3d-mapping-r/。 – lukeA 2015-02-07 17:20:56

+0

謝謝。我只注意到,rasterVis有一個圍繞rgl的包裝,可以輕鬆繪製3D表面。我正在努力使其適應我的需求。 – AF7 2015-02-07 19:56:10

回答

4

我發現有一些時間來看這個。最後,我採取了以下方法(與R代碼裏面):

http://pastebin.com/dA2nNNS0

感謝那些誰向我指出了正確的方向的意見。

保存文件時仍然有問題,但這是另一個問題的內容。從pastebin

代碼:

library(raster) 
library(rgl) 

r <- raster("topo12.nc", varname="topo") #Read file 
cols <- terrain.colors(3100) #Define colors 

binplot.3d <- function(x,y,z,alpha=1,topcol="#ff0000",sidecol="#aaaaaa"){ #Binplotting function 
    save <- par3d(skipRedraw=TRUE) 
    on.exit(par3d(save)) 

    x1<-c(rep(c(x[1],x[2],x[2],x[1]),3),rep(x[1],4),rep(x[2],4)) 
    z1<-c(rep(0,4),rep(c(0,0,z,z),4)) 
    y1<-c(y[1],y[1],y[2],y[2],rep(y[1],4),rep(y[2],4),rep(c(y[1],y[2],y[2],y[1]),2)) 
    x2<-c(rep(c(x[1],x[1],x[2],x[2]),2),rep(c(x[1],x[2],rep(x[1],3),rep(x[2],3)),2)) 
    z2<-c(rep(c(0,z),4),rep(0,8),rep(z,8)) 
    y2<-c(rep(y[1],4),rep(y[2],4),rep(c(rep(y[1],3),rep(y[2],3),y[1],y[2]),2)) 
    rgl.quads(x1,z1,y1,col=rep(sidecol,each=4),alpha=alpha) 
    rgl.quads(c(x[1],x[2],x[2],x[1]),rep(z,4),c(y[1],y[1],y[2],y[2]), 
       col=rep(topcol,each=4),alpha=1) 
    rgl.lines(x2,z2,y2,col="#000000") 
} 

cat("Row (of", dim(r)[1],"):") 
for (row in 1:dim(r)[1]) { #Plotting loop 
    for (col in 1:dim(r)[2]) { 
    if (round(r[row, col]) < 1) { 
    binplot.3d(c(col-1,col), c(row-1,row), r[row, col]/500, alpha=1, topcol="cadetblue3") 
    } else { 
    binplot.3d(c(col-1,col), c(row-1,row), r[row, col]/500, alpha=1, topcol=cols[round(r[row, col])]) 
# cat(round(r[row, col]), "\t") 
    } 
    } 
    cat(row, "") 
}