persp3d 绘图的格式

Posted

技术标签:

【中文标题】persp3d 绘图的格式【英文标题】:Formatting of persp3d plot 【发布时间】:2013-06-19 23:23:42 【问题描述】:

我有以下 3d 图:

使用我的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 值的适当着色。

【问题讨论】:

请注意:我不知道为什么,但我必须在打开工作区之前加载 rgl 包,否则我的 R 会崩溃,我不知道为什么。 【参考方案1】:

试试这个:

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)

您已经知道如何正确编辑坐标区了。

【讨论】:

这些都是很好的答案,非常感谢您的帮助!【参考方案2】:

要声明对轴的控制,您需要在 persp3d 调用中设置 axes=FALSE(如您昨天所说),然后使用带有您选择的参数的 axes3daxis3d 函数。要指定沿下 yz 框段显示值的 x 轴,请使用 edge= 'x--'。要使用行名标记 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 没有太大区别,我认为那里的有用贡献没有正面回应。我想知道如果人们变得不感兴趣。)

【讨论】:

我的缩放不是“明显错误”(因为从未指定所需的轴注释),但您的回答清楚地证实了我进一步努力的意义不大。【参考方案3】:

以下是回答您关于根据 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)] )

【讨论】:

这些都是很好的答案,非常感谢您的帮助!

以上是关于persp3d 绘图的格式的主要内容,如果未能解决你的问题,请参考以下文章

VC自绘图形怎么保存成BMP或者JPG格式?

Python:如何将 shapefile 放在一个绘图中的光栅文件顶部,然后将绘图保存为 Jpeg 文件格式

PHP 绘图技术

绘图纸格式不统一

pandas绘图设置背景

绘图单位及精度是否可以自定义设置呢?