在R中设计多元密度图

14

我看到了一个使用Tikz制作的吸引人的多元密度图,并想知道是否有一种方法可以在R中使用自己的数据复制这个图。我不熟悉Tikz,但我发现了这个参考资料,它似乎暗示我可以在R中使用这个功能。http://www.texample.net/tikz/examples/tikzdevice-demo/

简而言之,使用提供的两个数据样本,最好的方法是创建一个非常类似(当然分布不同)于下面显示的图形。

以下是一些示例数据,可用于创建分布图。

# Sample data
var1 <- exp(rlnorm(100000, meanlog=0.03, sdlog=0.15))/100
var2 <- 1-(var1 + rnorm(100000, 0, 0.01))

这是我找到原始图表的参考页面:

https://tex.stackexchange.com/questions/31708/draw-a-bivariate-normal-distribution-in-tikz

enter image description here

1个回答

10
你可以使用persp函数绘制三维图形(如果你从数据中绘制而不是公式,则需要首先使用某种形式的密度估计,示例图看起来足够平滑,可能是基于公式而不是从数据估计得出的)。然后使用persp的返回值投射其他绘图信息。
也可能有一种选项使用rgl包,我记得它有一种方法将绘图投影到轴平面上。 编辑 这里有一些示例代码供您开始。它使用参数分布,但可以改编为使用MASS中的kde2d或其他从数据中估计密度的方式:
x <- seq( -3, 3, length=25 )
y <- seq( -3, 3, length=25 )

z <- outer( x, y, function(x,y) dnorm(x,0,0.5)*dnorm(y,0,1) )
zl <- c(0,4*max(z))

## persp plot
trmat <- persp(x,y,z, theta=120, zlim=zl, box=FALSE, shade=0.5)

## x grid
for( i in seq(-3,3, by=0.5 ) ) {
    lines( trans3d( c(i,i), c(-3,-3), zl, trmat ), col='grey' )
}
for( i in seq(0,zl[2], length=7) ) {
    lines( trans3d( c(-3,3), c(-3,-3), c(i,i), trmat ), col='grey' )
}

## marginal for x

lines( trans3d( seq(-3,3,length=100), -3, dnorm(seq(-3,3,length=100),0,.5), 
    trmat), lwd=2, col='blue' )

## y grid
for( i in seq(-3,3, by=0.5 ) ) {
    lines( trans3d( c(-3,-3), c(i,i), zl, trmat ), col='grey' )
}
for( i in seq(0,zl[2], length=7) ) {
    lines( trans3d( c(-3,-3), c(-3,3), c(i,i), trmat ), col='grey' )
}

## marginal for y

lines( trans3d( -3, seq(-3,3,length=100), dnorm(seq(-3,3,length=100),0,1), 
    trmat), lwd=2, col='blue' )

在这里输入图片描述


1
谢谢,我已经更新了示例代码,将一个额外的随机组件添加到var2中。 - rrbest
1
嗨Greg--非常好的回答。我刚刚添加了您代码生成的绘图的图片,并删除了第一句话,因为它只在OP更新其示例数据之前有意义。希望你不介意。 - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接