Добавление плоскости в scatterplot3d

x <-rnorm(500,50,2)
y <-rnorm(500,5,1)
z <-rnorm(500,6,1)

s3d <- scatterplot3d(x[z<6], y[z<6], z[z<6], zlim=range(z),  color="darkgrey", col.axis="blue",col.grid="lightblue",   main="scatterplot3d - 1", pch=20)
s3d$plane3d(6,0,0)
s3d$points3d(x[z>=6], y[z>=6], z[z>=6], pch=20)

Приведенный выше код говорит мне, как добавить плоскость «z = 6» к 3D-диаграмме рассеивания.

Первый вопрос: мне интересно, как добавить плоскость, такую ​​как «x = 3» или «y = 2».

Файл справки R объясняет, что

plane3d(Intercept, x.coef = NULL, y.coef = NULL, lty = "dashed", lty.box = NULL, ...). Instead of Intercept a vector containing 3 elements can be specified.

Второй вопрос: мне также интересно, что делает «вектор с 3 элементами» вместо Intercept и какова роль аргумента x.coef и y.coef.


person user67275    schedule 20.02.2015    source источник


Ответы (1)


Вопрос 1: я бы использовал линейную модель для добавления плоскостей, как я описываю здесь и как авторы пакета используют в виньетке :

plot3d <- scatterplot3d(x, y, z, ... )
model  <- lm(y ~ x + z)
plot3d$plane3d(model)

Вы можете указать перехваты xyz вручную, но я не рекомендую это делать, так как это приводит к несколько странному поведению. Вы также можете построить сложные сетчатые поверхности, используя функцию, предназначенную для точек, но, как утверждают авторы в виньетке:

Обратите внимание, что scatterplot3d предназначен для создания точечных диаграмм, а не для рисования поверхностей, он не очень удобен для этой цели, для чего мы обычно предпочитаем использовать функцию R persp.

Вопрос 2: Вектор с тремя элементами является контейнером для перехватов xyz. Вы можете указать их вручную, как вы сделали выше с s3d$plane3d(6,0,0). Коэффициенты x и y предназначены для отображения этих двух переменных на плоскости.

Чтобы сделать определенные плоскости вручную, вот предложение от Уве сам:

spd <- scatterplot3d(1:10, 1:10, 1:10)

# xy
spd$plane3d(0.3549896,0,0,lty="dotted")

# yz
x0 <- 5
xyz1 <- spd$xyz.convert(rep(x0, 6), rep(0, 6), seq(0, 10, by=2))
xyz2 <- spd$xyz.convert(rep(x0, 6), rep(10, 6), seq(0, 10, by=2))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

xyz1 <- spd$xyz.convert(rep(x0, 6), seq(0, 10, by=2), rep(0, 6))
xyz2 <- spd$xyz.convert(rep(x0, 6), seq(0, 10, by=2), rep(10, 6))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

# zx
y0 <- 6
xyz1 <- spd$xyz.convert(rep(0, 6), rep(y0, 6), seq(0, 10, by=2))
xyz2 <- spd$xyz.convert(rep(10, 6), rep(y0, 6), seq(0, 10, by=2))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

xyz1 <- spd$xyz.convert(seq(0, 10, by=2), rep(y0, 6), rep(0, 6))
xyz2 <- spd$xyz.convert(seq(0, 10, by=2), rep(y0, 6), rep(10, 6))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")

Точки сначала выбираются с регулярным интервалом, соответствующим сетке в пространстве xyz, используя встроенную функцию преобразования координат xyz, а затем сопоставляют сегменты между ними, создавая сетки:

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

person Adam Erickson    schedule 17.10.2015