2011-09-27 143 views
4

我有在数据帧中的以下数据:3D图中的R - 补丁

**x** in (0,1) 
**y** in [0,1] 
**z** in [0,1] 

例如:

X,Y,Z 
0.1, 0.2, 0.56 
0.1, 0.3, 0.57 
... 

我想他们绘制在这个类型的图表: A 3d plot

我试过R,但我所能得到的只是一个not-so-fancy 3d scatterplot。 我也读了关于lattice 3d wireframe,但我无法理解它。

我该怎么做才能在R中得到像线框一样的Matlab? 涉及哪些数据转换?

这是从文档中的示例代码:

x <- seq(-pi, pi, len = 20) 
y <- seq(-pi, pi, len = 20) 
g <- expand.grid(x = x, y = y) 
g$z <- sin(sqrt(g$x^2 + g$y^2)) 
wireframe(z ~ x * y, g, drape = TRUE, 
aspect = c(3,1), colorkey = TRUE) 

我并不觉得特别清楚。

编辑persp3d函数工作正常,我能够生成一个颜色的3d图。如何设置相对于z值的色阶?

感谢您的任何提示, Mulone

+0

确实需要一点练习才能将(x,y,z)数据转换为线框或其他3-d网格绘图工具的z值矩阵。学习转换是值得的,因为一旦你知道如何,你永远不会忘记:-)。你可能会喜欢scatterplot3d软件包,它允许wiregrid绘图。 –

+0

这是未经测试的,所以它只是作为评论而不是答案。我会推荐'with(mydata,persp(x = sort(unique(X)),y = sort(unique(Y)),z = matrix(z,ncol = length(unique(x)))))' - - 我不太确定我是否按照正确的顺序组织了矩阵(可能是'byrow = TRUE'等。) –

+2

请参阅'example(wireframe)'和'example(persp)'并检查它是否符合您的需求。 – Marek

回答

11

使用outer创建z值,然后使用persp绘制:

z <- outer(x,y, function(x,y) sin(sqrt(x^2+y^2))) 
persp(x,y,z) 

persp

有着色并设置查看选项角度,请参见?persp。查看Matlab风格着色的第四个示例。

对于交互式情节,考虑在rgl包使用persp3d

require(rgl) 
persp3d(x,y,z,col="blue") 

编辑

要添加颜色,有一个从所述方法中persp稍有差异,由于彩色涉及到顶点而不是面的中心,但它更容易。

jet.colors <- colorRampPalette(c("blue", "green")) 
pal <- jet.colors(100) 
col.ind <- cut(z,100) # colour indices of each point 
persp3d(x,y,z,col=pal[col.ind]) 

persp3d

帮助文件建议添加参数smooth=FALSE,但是这是个人喜好。

+0

你可以包括结果的图片吗? –

+0

@RomanLuštrik现在加入 – James

+1

问题w /这个答案是假设z = f(x,y)。 OP说他有一组有序的三元组(x,y,z),在这种情况下,他需要生成一个拟合函数。当然,这不会绘制确切的原始数据。 –