我有以下三维图:
使用我的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值创建着色。 根据{{3}}的解决方案如下:
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 :(得分:22)
试试这个:
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)
如果您希望着色是时间(因此尖峰总是红色),您可以为每个时间片设置着色:
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)
您已经知道如何正确编辑轴。
答案 1 :(得分:6)
要断言对轴的控制,您需要在axes=FALSE
来电中设置persp3d
(正如您昨天所说),然后使用axes3d
和axis3d
具有您选择的参数的函数。要指定沿yz-box下段显示值的x轴,请使用edge= 'x--'
。要使用rownames标记y轴,请使用'labels'和'at'参数:
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)] )
(注意:要正确地玩这个SO游戏,你需要给予提供帮助的其他人。这与a question from yesterday没什么不同,我看不到对那里有用贡献的积极回应。我我想知道人们是否变得不感兴趣。)
答案 2 :(得分: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)] )