Ответ 1
Вы можете начать с функции persp
, чтобы нарисовать трехмерный график (если вы делаете это по данным, а не по формуле, тогда вам нужно сначала использовать некоторую форму оценки плотности, примерный график выглядит достаточно гладко, вероятно, основанный на формуле, а не на основании данных). Затем используйте возвращаемое значение из persp
, чтобы спроектировать дополнительную информацию о графике.
Также может быть опция с использованием пакета rgl, я, кажется, помню, что у него есть способ проецировать график на плоскости осей.
Edit
Вот пример кода, чтобы вы начали. Он использует параметрическое распределение, но может быть адаптирован для использования 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' )