2013-06-23 40 views
10

我有以下3D圖:格式化

ro

隨着我data我用下面的代碼創建它:

library(rugarch) 
library(rgl) 
library(fGarch) 

fd <- as.data.frame(modelfit, which = 'density') 
color <- rgb(85, 141, 85, maxColorValue=255) 

x <- seq(-0.2, 0.2, length=100) 
y <-c(1:2318) 

f <- function(s, t) { 
dged(s,mean=fd[t,'Mu'],sd=fd[t,'Sigma'],nu=fd[t,'Shape']) 

} 

z <- outer(x, y, f) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color, 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

我怎樣才能獲得的着色取決於z值?我研究了不同的解決方案,例如這one,但我不能創建這種情況下取​​決於z值的着色。 根據this thread的解決辦法是以下幾點:

nrz <- nrow(z) 
ncz <- ncol(z) 
jet.colors <- colorRampPalette(c("#ffcccc", "#cc0000")) 
# Generate the desired number of colors from this palette 
nbcol <- 100 
color <- jet.colors(nbcol) 

# Compute the z-value at the facet centres 
zfacet <- z[-1, -1] + z[-1, -ncz] + z[-nrz, -1] + z[-nrz, -ncz] 
# Recode facet z-values into color indices 
facetcol <- cut(zfacet, nbcol) 

    persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[facetcol], 
      ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

但是,這並沒有給一個好的結果,因爲它沒有顏色適當的情節。我想讓我的表面尖刺是例如以紅色表示,低值爲例如藍色,平滑過渡很不錯,但是這種顏色的切片,取決於時間?因此,極端大的尖峯應該在它們的紅色尖峯和底部的值上被着色,例如,以綠色。我怎樣才能得到這個?

編輯:我發現了一個解決方案,我的上一個問題關於軸上的日期,唯一的問題是,一個合適的着色依賴於z值。

+0

請注意:我不知道爲什麼,但我有,否則打開工作區我的[R崩潰之前加載RGL包,我不知道爲什麼。 –

回答

21

試試這個:

nbcol = 100 
color = rev(rainbow(nbcol, start = 0/6, end = 4/6)) 
zcol = cut(z, nbcol) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[zcol], 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

theplot

如果你想着色是通過時間(所以尖峯總是紅紅的),你可以設置每個着色時間片:

mycut = function(x, breaks) as.numeric(cut(x=x, breaks=breaks)) # to combine different factors 
zcol2 = as.numeric(apply(z,2, mycut, breaks=nbcol)) 
persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color[zcol2], 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=TRUE) 

theplot2

您已經知道如何正確編輯軸。

+1

這些都是很好的答案,非常感謝您的幫助! –

6

要斷言控制軸,您需要設置axes=FALSE(因爲你被告知昨天)在persp3d呼叫,然後使用axes3daxis3d功能與您所選擇的參數。若要指定一個x軸,並在yz-box下方顯示值,請使用edge= 'x--'。標記y軸與rownames,使用「標籤」和「在」參數:

plot3d (..., axes=FALSE, ...) 
# repositions x axis and draws default z axis 
axes3d(c('x--','z')) 
# Use custom labels 
axis3d(edge= 'y+-', at =seq(500,2000,by=500), 
        labels = rownames(fd)[seq(500,2000,by=500)]) 

enter image description here

(注意:要正確地玩這個SO遊戲,你需要給信貸別人誰這與a question from yesterday沒有多大區別,我看到沒有積極的迴應,因爲這裏有幫助的貢獻,我想知道是否人們變得不感興趣。)

+5

我的比例是不是「明顯錯誤」(因爲從來沒有指定所需的軸註釋),但你的反應顯然是確認我會有我的發揮進一步的努力毫無意義。 –

4

以下是解決你的問題的方法,表面取決於z值。這個想法是根據其相對高度爲表面的每個點分配一種顏色。 下面的代碼包含@DWin提出的軸自定義。

library(rugarch) 
library(rgl) 
library(fGarch) 

fd <- as.data.frame(modelfit, which = 'density') 
x <- seq(-0.2, 0.2, length=100) 
y <- c(1:2318) 

f <- function(s, t) { 
    dged(s,mean=fd[t,'Mu'],sd=fd[t,'Sigma'],nu=fd[t,'Shape']) 
} 

z <- outer(x, y, f) 

## Color definition of each point of the surface 
height <- (z - range(z)[1])/diff(range(z)) 
r.prop <- height 
g.prop <- 0 
b.prop <- 1 - height 
color <- rgb(r.prop, g.prop, b.prop, maxColorValue=1) 

persp3d(x, y, z, theta=50, phi=25, expand=0.75, col=color, 
     ticktype="detailed", xlab="", ylab="time", zlab="",axes=FALSE) 
axes3d(c('x--','z')) 
# Use custom labels 
axis3d(edge= 'y+-', at =seq(500,2000,by=500), 
     labels = rownames(fd)[seq(500,2000,by=500)]) 

theplot

+0

這些都是很好的答案,非常感謝您的幫助! –