2013-03-13 69 views
6

我已经与MASS包玩耍并且可以绘制两个二元正态简单地使用图像和参数(新= TRUE),例如:的R - 绘制在3D 2个二元正态和它们的轮廓分别

# lets first simulate a bivariate normal sample 
library(MASS) 
bivn <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1, .5, .5, 1), 2)) 
bivn2 <- mvrnorm(1000, mu = c(0, 0), Sigma = matrix(c(1.5, 1.5, 1.5, 1.5), 2)) 

# now we do a kernel density estimate 
bivn.kde <- kde2d(bivn[,1], bivn[,2], n = 50) 
bivn.kde2 <- kde2d(bivn2[,1], bivn[,2], n = 50) 

# fancy perspective 
persp(bivn.kde, phi = 45, theta = 30, shade = .1, border = NA) 
par(new=TRUE) 
persp(bivn.kde2, phi = 45, theta = 30, shade = .1, border = NA) 

这看起来不太好,我想我必须玩弄轴和东西。 但是,如果我尝试类似的方法与轮廓不重叠。他们被简单地取代:

# fancy contour with image 
image(bivn.kde); contour(bivn.kde, add = T) 
par(new=TRUE) 
image(bivn.kde2); contour(bivn.kde, add = T) 

这是最好的方法来我想要什么或我只是让自己很难?欢迎任何建议。谢谢!

+1

我真的不知道你正在尝试看看?两种密度之间的差异?你为什么不把它们并排绘制? – Seth 2013-03-13 21:31:45

+0

我正在研究jeffries-matusita距离的行为,我想看看两个分布如何重叠,以及每个“变量”的j-m距离如何移动以及两个类别(两个分布)的分类如何变差。 – JEquihua 2013-03-13 22:44:05

回答

9

也许你可以使用rgl库。它允许您创建交互式3D图。

require(rgl) 

col1 <- rainbow(length(bivn.kde$z))[rank(bivn.kde$z)] 
col2 <- heat.colors(length(bivn.kde2$z))[rank(bivn.kde2$z)] 
persp3d(x=bivn.kde, col = col1) 
with(bivn.kde2, surface3d(x,y,z, color = col2)) 

enter image description here

如果你想绘制两个面之间的区别,那么你可以这样做以下。

res <- list(x = bivn.kde$x, y = bivn.kde$y, z = bivn.kde$z - bivn.kde2$z) 
col3 <- heat.colors(length(res$z))[rank(res$z)] 
persp3d(res, col = col3) 

enter image description here