2016-09-02 112 views
0

我有一個從模擬生成數據,然後想要繪製(熱圖/輪廓/ 3d圖等)的觀點;但是,對於這些數據,需要使用interp等函數進行插值。這裏是樣本dataset「interp」獲得熱圖/輪廓R

下面是一段代碼,我想...

library(akima) 
library(GA) # for persp3D; there exists another package for same function "fields" 

data <- read.table(commandArgs()[3], header=T,sep="\t") 
data <- na.omit(data) 

qmax = max(data$q) 
kmax = max(data$k) 

x <- data$k_bike/kmax 
y <- data$k_car/kmax 
z <- data$q/qmax 

matrix = interp(x,y,z) 

persp3D(matrix ,nlevels=30, asp=1, xlim=c(0,1), ylim=c(0,1), color.palette=colorRampPalette(c("green3","yellow", "red"),space = "rgb")) 

所以結果是 - enter image description here

現在,由於插值,有很多點,其中有紅/橙色代替綠色等等。對於例如,如果我使用的lattice

levelplot(z~x*y, xlim=c(0,1), ylim=c(0,1), col.regions=colorRampPalette(c("green3","yellow", "red"),space = "rgb")) 

levelplot結果是 -

enter image description here

現在,它是清晰可見的,有有極少數的數據點零(或幾乎爲零)值爲z。現在,問題是,在levelplot中,我得到了人爲因素(缺少數據點的白色),我想要更好的插值。有沒有其他功能來執行此操作?

我也試過等高線圖如下:

scale <- (qmax+10)/qmax * c(0.000, 0.01, 0.05, 0.10, 0.25, 0.5, 0.75, 1.0) 
filled.contour(matrix, nlevels=30, asp=1, xlim=c(0,1), ylim=c(0,1), levels=scale,color.palette=colorRampPalette(c("green3","yellow", "red"),space = "rgb")) 

和結果又是(一種顏色不對指示的)。

enter image description here

總之 - 我想有等高線圖或3D圖,但具有零(大約爲零)z值數據 點類似電平的 清晰(或正確)顏色指示情節。

回答

1

我走近deldirrgl包(它們允許通過繪製點的不規則集合定義的表面)你的問題。

library(deldir); library(rgl) 

# Below two lines require time depending on the machine power, be careful 
dxyz <- deldir(x, y, z = z)  # do Delaunay triangulation 
mxyz <- as.mesh3d(dxyz)   # convert it to triangle.mesh3d.obj 

bgyr <- colorRampPalette(c("blue", "green", "yellow", "red")) # colour func 

# use z values for colouring 
plot3d(mxyz, col=bgyr(256)[cut(mxyz$vb[3,], 256)][mxyz$it], type="shade") 
light3d()   # if you want vivit colours 

enter image description here

# another approach 
# you can solve it by just increasing interp()'s arguments, nx and ny. 

library(akima); library(lattice); library(dplyr) 

df <- interp(x,y,z, nx=150, ny=150) %>% interp2xyz() %>% data.frame() 
levelplot(z ~ x * y, df, xlim=c(0,1), ylim=c(0,1), 
      col.regions = colorRampPalette(c("green3", "yellow", "red"), space = "rgb")) 
+0

你的第二個方法已經回答了我的問題。但是,我仍然想嘗試第一個(然後接受答案)。我猜'as.mesh3d'需要'nat'包但是會拋出一個錯誤(** UseMethod(「as.mesh3d」)中的錯誤: 沒有適用於'as.mesh3d'的方法應用於class deluder類「**) – novice

+0

@Amit;我想你不會使用最新版本的'rgl'軟件包(舊版本沒有處理'deldir.obj'的方法)。請運行'install.packages(「rgl」)'並重試第一個。 – cuttlefish44

+0

謝謝。重新安裝「rgl」工作。但是,我仍然對第二種方法感到高興。感謝提示。 – novice