I am new to using plotly, and I am trying to add a set of planes into data at specific points.
I have been able to add the planes in scatterplot3d successfully with the following code:
my_data <- mtcars
# Create Scatter Plot
library(scatterplot3d)
# Scale data accordingly
cars_3d_plot <- scatterplot3d(x = scale(my_data$drat), y = scale(my_data$wt), z = scale(my_data$qsec),
highlight.3d = F, type = "p",
pch = 16,
ylab = "wt (y)", zlab = "qsec (z)", xlab = "drat (x)",
xlim = c(-4,5),
ylim = c(-4,5),
zlim = c(-4,5))
# Put in Qsec Cut - scale down from 20
qsec_cut <- (20-mean(my_data$qsec, na.rm = T))/sd(my_data$qsec, na.rm = T)
cars_3d_plot$plane3d(qsec_cut, 0, 0)
# Put in Drat Cut at 3.596563
drat_before <- 3.596563
drat_scaled <- (3.596563 - mean(my_data$drat, na.rm = T))/sd(my_data$drat, na.rm = T)
# YZ
# THIS CUTS THE PLANE AT X = 5
x0 <- drat_scaled
xyz1 <- cars_3d_plot$xyz.convert(rep(x0, 11), rep(-4, 11), seq(-4, 6, by=1))
xyz2 <- cars_3d_plot$xyz.convert(rep(x0, 11), rep(6, 11), seq(-4, 6, by=1))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")
xyz1 <- cars_3d_plot$xyz.convert(rep(x0, 11), seq(-4, 6, by=1), rep(-4, 11))
xyz2 <- cars_3d_plot$xyz.convert(rep(x0, 11), seq(-4, 6, by=1), rep(6, 11))
segments(xyz1$x, xyz1$y, xyz2$x, xyz2$y, lty="dotted")
However, I would like to make it interactive and use plotly.
I have read this page (Add Regression Plane to 3d Scatter Plot in Plotly) and have successfully added a regression (can give code if needed)
However, I would really like to add these planes in an interactive form in plotly and am quite stuck :(. If you could please help or point in the right direction :) Thank you in advance.
I have tried using the rgl package but with the data I have it doesn't compute the axis properly and I have gone down the plotly rabbit hole.
Edit: I have used add_mesh to add on the z-axis, however, how do I add a mesh for when x = 4?
my_data <- mtcars
df <- data.frame(x = my_data$drat, y = my_data$wt, z = my_data$qsec)
planDf <- data.frame(x = rep(range(df$x, na.rm = T), 2), y = rep(range(df$y, na.rm = T), each = 2), z = 20)
plan_df_2 <- data.frame(x = rep(range(df$x, na.rm = T), 2), y = rep(range(df$y, na.rm = T), each = 2), z = 100)
library(plotly)
my_data$gear = as.character(my_data$gear)
plot_ly(my_data) %>%
add_markers(x = ~drat, y = ~wt, z = ~qsec, color = ~gear, colors = c("firebrick", "forestgreen", "orange")) %>%
add_mesh(x = ~x, y = ~y, z = ~z, data = planDf, opacity = 0.3)