Проектирование многомерного графика плотности в R

Я увидел привлекательный многомерный график плотности с использованием 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

введите здесь описание изображения


person rrbest    schedule 20.03.2014    source источник


Ответы (1)


Вы можете начать с функции persp, чтобы нарисовать трехмерный график (если вы делаете это из данных, а не из формулы, вам нужно сначала использовать некоторую форму оценки плотности, примерный график выглядит достаточно гладким, что, вероятно, он основан на формуле а не по данным). Затем используйте возвращаемое значение из persp для проецирования дополнительной информации о графике.

Еще может быть вариант с использованием пакета rgl, кажется в нем есть способ проецировать график на плоскости осей.

Изменить

Вот пример кода, с которого можно начать. Он использует параметрическое распределение, но может быть адаптирован для использования kde2d из MASS или других способов оценки плотности по данным:

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' )

введите здесь описание изображения

person Greg Snow    schedule 20.03.2014
comment
Спасибо, я обновил пример кода, включив дополнительный случайный компонент в var2. - person rrbest; 21.03.2014
comment
Привет, Грег. Отличный ответ. Я только что добавил изображение сюжета, созданного вашим кодом, и удалил первое предложение, которое имело смысл только до того, как ОП обновил свои образцы данных. Надеюсь, ты не против. - person Josh O'Brien; 21.03.2014