I am trying to add a flat surface to this plot (Excuse the size, if I make it bigger the file is too large). The surface should be parallel to the ground with the third dimension equal zero. It should go through the red points.
Code to reproduce:
n.cases <- 240
n.vars <- 4
set.seed(26)
eps <- rnorm(n.vars, 0, 1/4)
x <- matrix(rnorm(n.cases * (n.vars+2)), nrow=n.cases)
beta <- rbind(c(1,rep(0, n.vars)), c(0,rep(1, n.vars)), cbind(rep(0,n.vars), diag(eps)))
y <- x%*%beta
data <- data.frame(y)
data.1.2 <- data[,1:2]
data.1.2$X3 <- integer(nrow(data.1.2))
data.1.2$group = 'First Iteration'
data.1.3 <- data[,1:3]
data.1.3$group = 'Second Iteration'
newdf <- rbind(data.1.2, data.1.3)
library(plotly)
plot_ly(x=newdf$X1, y=newdf$X2, z=newdf$X3, color = newdf$group, colors = c('#BF382A', '#0C4B8E')) %>%
add_markers() %>%
layout(scene = list(xaxis = list(title = 'First Dimension'),
yaxis = list(title = 'Second Dimension'),
zaxis = list(title = 'Third Dimension'),
bgcolor = "rgb(244, 244, 248)"))
I tried to use add_surface, but without success so far. I do not understand what kind of matrix the function needs. I tried it with
matrix <- cbind(c(-5,-4,-3,-2,-1,0,1,2,3,4,5), c(-5,-4,-3,-2,-1,0,1,2,3,4,5), c(0,0,0,0,0,0,0,0,0,0,0))
and then adding the surface through
%>% add_surface(z=~matrix2)
but this does end up with
Error in traces[[i]][[obj]] :
attempt to select less than one element in get1index
I think I do not understand how the matrix has to look like yet.
Thank you!
I think you are looking for something like this:
matrix2 <- c(
c(0,0,0,0),
c(0,0,0,0),
c(0,0,0,0),
c(0,0,0,0)
)
dim(matrix2) <- c(4,4)
y <- c(-2,-1,0,1)
x <- c(-2,-1,0,1)
rownames(matrix2) <- x
colnames(matrix2) <- y
plot_ly() %>%
add_markers(data = newdf, x=~X1, y=~X2, z=~X3, color = ~group, colors = c('#BF382A', '#0C4B8E')) %>%
layout(scene = list(xaxis = list(title = 'First Dimension'),
yaxis = list(title = 'Second Dimension'),
zaxis = list(title = 'Third Dimension'),
bgcolor = "rgb(244, 244, 248)")) %>% add_surface(z=~matrix2, x = ~x, y= ~y)