Вставьте поле отсечки в график поверхности R

Я использую persp() для создания 3D-графика (но я открыт для всего, что поможет выполнить эту работу). Теперь я хочу добавить 2D-поле, чтобы было ясно, где 3D-график находится выше определенного значения Z. Есть ли способ добиться этого? В идеале это должно быть что-то вроде полупрозрачной поверхности, где вы можете видеть массу под поверхностью и над ней.

На примере из документации persp

f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }

x <- seq(-10, 10, length= 30)
y <- x
z <- outer(x, y, f)
z[is.na(z)] <- 1

persp(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue",
      ltheta = 120, shade = 0.75, ticktype = "detailed",
      xlab = "X", ylab = "Y", zlab = "Sinc( r )"
) 

Как я могу вставить поле, которое разрезает график в определенной точке оси Z?


person L Xandor    schedule 16.03.2016    source источник


Ответы (1)


Как насчет этого? Есть гораздо больше возможностей с использованием пакета rgl, но у него есть функция persp3d для легкого обновления с базового graphics.

library(rgl)

f <- function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r }
x <- seq(-10, 10, length= 30)
y <- x
z <- outer(x, y, f)
z[is.na(z)] <- 1

persp3d(x, y, z, theta = 30, phi = 30, expand = 0.5, col = "lightblue",
      ltheta = 120, shade = 0.75, ticktype = "detailed",
      xlab = "X", ylab = "Y", zlab = "Sinc( r )")

# Here we add a transparent purple square to mark the top

# x and y mark the corners of the purple square, z is its height
sqdf <- data.frame(x=c(-10,-10,10,10,-10),
                   y=c(-10, 10,10,-10,-10),
                   z=c(5,5,5,5,5))

# now draw the purple square, 
#    note:
#    -  the "add=T" parameter that appends it to the previous 3d-plot
#    -  the coord paramter tells it what two planes to use when 
#        tesselating the polygon into triangles 
#        (a necessary step and expensive to calculate)

polygon3d(sqdf$x,sqdf$y,sqdf$z,coord=c(1,2),alpha=0.5,color="purple",add=T)

Урожайность:

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

person Mike Wise    schedule 16.03.2016
comment
Любая обратная связь для этого? - person Mike Wise; 18.03.2016
comment
Извините, что путешествовал последние несколько дней - это прекрасно, большое спасибо. - person L Xandor; 22.03.2016
comment
Дополнительный вопрос - я пытаюсь построить p.values, поскольку я меняю разные параметры. Моя первая попытка дает «x» и «n» должны иметь одинаковое предупреждение о длине, когда я пытаюсь запустить внешний. Можете ли вы сказать, что я делаю неправильно? x <- seq(10000, 100000, length=10) y <- x f <- function(x, y) { prop.test(c(rbinom(1, x, 0.5), rbinom(1, y, 0.4)), c(x, y))$p.value } z <- outer(x, y, f) - person L Xandor; 22.03.2016
comment
Сообщение об ошибке исходит от prop.test, а не от outer. Хотя мне непонятно, что вы делаете. Разбейте его на небольшие шаги (т. е. вычислите явные векторные входные данные для функции prop.test) и убедитесь, что вы вычисляете то, что хотите. И не помещайте его в функцию f, пока он не заработает, не будет иметь смысла для вас и, кажется, не будет вычислять то, что вы хотите. - person Mike Wise; 23.03.2016