我看到了一个使用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
最佳答案
您可以从persp
函数开始绘制3维图(如果从数据而不是从公式进行绘制,则需要首先使用某种形式的密度估计,示例图看起来足够平滑,以至于它可能基于公式,而不是根据数据进行估算)。然后使用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' )
关于r - 在R中设计多元密度图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22545245/