# 3D Regression plane with scatter plot

``````library(tidyverse)  # data wrangling
library(plotly)  # 3D plot interactive``````

# 2 Define model

Here’s the linear model with 2 predictors, giving us a model that can be visualized in 3D:

``lm1 <- lm(mpg ~ hp + disp, data = mtcars)``

As is standard, we’ll predict `mpg`.

# 3 Define grid for regression plane

The regression plane describes one value for each predictor pair, `hp` and `disp`:

``hp_disp_grid <- expand_grid(hp = seq(50, 500, by = 10), disp = seq(50, 500, by = 10))``

Here, we define all possible pairs of the two variables, spanning a range of each from 50 to 500.

Now, let’s add the predicted value for `mpg` according to our modeL

``````grid2 <-
hp_disp_grid %>%
mutate(mpg_pred_lm1 = predict(lm1, newdata = data.frame(hp, disp)))``````

And now cast wider and in matrix form:

``````grid_wide <-
grid2 %>%
pivot_wider(names_from = disp, values_from = mpg_pred_lm1) %>%
select(-1) %>%  # kick the name's column out
as.matrix()``````

# 4 Scatter Plot

``````p1 <- plot_ly(mtcars,
x = ~ hp,
y = ~ disp,
z = ~ mpg,
type = "scatter3d")
p1``````

# 5 Scatter plot with 3D surface

``````p2 <- add_trace(p = p1,
z = grid_wide,
x = seq(50, 300, by = 10),
y = seq(50, 500, by = 10),
type = "surface")
p2``````

Note that the plot is interactive.

# 6 Reproducibility

``````#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.1.3 (2022-03-10)
#>  os       macOS Big Sur/Monterey 10.16
#>  system   x86_64, darwin17.0
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Europe/Berlin
#>  date     2022-04-19
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#>  package     * version date       lib source
#>  assertthat    0.2.1   2019-03-21 [1] CRAN (R 4.1.0)
#>  backports     1.4.1   2021-12-13 [1] CRAN (R 4.1.0)
#>  blogdown      1.8     2022-02-16 [2] CRAN (R 4.1.2)
#>  bookdown      0.24.2  2021-10-15 [1] Github (rstudio/bookdown@ba51c26)
#>  brio          1.1.3   2021-11-30 [1] CRAN (R 4.1.0)
#>  broom         0.7.12  2022-01-28 [1] CRAN (R 4.1.2)
#>  bslib         0.3.1   2021-10-06 [1] CRAN (R 4.1.0)
#>  cachem        1.0.6   2021-08-19 [1] CRAN (R 4.1.0)
#>  callr         3.7.0   2021-04-20 [1] CRAN (R 4.1.0)
#>  cellranger    1.1.0   2016-07-27 [1] CRAN (R 4.1.0)
#>  cli           3.2.0   2022-02-14 [1] CRAN (R 4.1.2)
#>  codetools     0.2-18  2020-11-04 [2] CRAN (R 4.1.3)
#>  colorout    * 1.2-2   2022-01-04 [1] Github (jalvesaq/colorout@79931fd)
#>  colorspace    2.0-3   2022-02-21 [1] CRAN (R 4.1.2)
#>  crayon        1.5.1   2022-03-26 [1] CRAN (R 4.1.2)
#>  crosstalk     1.1.1   2021-01-12 [2] CRAN (R 4.1.0)
#>  data.table    1.14.2  2021-09-27 [1] CRAN (R 4.1.0)
#>  DBI           1.1.2   2021-12-20 [1] CRAN (R 4.1.0)
#>  dbplyr        2.1.1   2021-04-06 [1] CRAN (R 4.1.0)
#>  desc          1.4.0   2021-09-28 [1] CRAN (R 4.1.0)
#>  devtools      2.4.3   2021-11-30 [1] CRAN (R 4.1.0)
#>  digest        0.6.29  2021-12-01 [1] CRAN (R 4.1.0)
#>  dplyr       * 1.0.8   2022-02-08 [1] CRAN (R 4.1.2)
#>  ellipsis      0.3.2   2021-04-29 [1] CRAN (R 4.1.0)
#>  evaluate      0.14    2019-05-28 [1] CRAN (R 4.1.0)
#>  fansi         1.0.3   2022-03-24 [1] CRAN (R 4.1.2)
#>  farver        2.1.0   2021-02-28 [1] CRAN (R 4.1.0)
#>  fastmap       1.1.0   2021-01-25 [2] CRAN (R 4.1.0)
#>  forcats     * 0.5.1   2021-01-27 [1] CRAN (R 4.1.0)
#>  fs            1.5.2   2021-12-08 [1] CRAN (R 4.1.0)
#>  generics      0.1.2   2022-01-31 [1] CRAN (R 4.1.2)
#>  ggplot2     * 3.3.5   2021-06-25 [2] CRAN (R 4.1.0)
#>  glue          1.6.2   2022-02-24 [1] CRAN (R 4.1.2)
#>  gtable        0.3.0   2019-03-25 [1] CRAN (R 4.1.0)
#>  haven         2.4.3   2021-08-04 [1] CRAN (R 4.1.0)
#>  hms           1.1.1   2021-09-26 [1] CRAN (R 4.1.0)
#>  htmltools     0.5.2   2021-08-25 [1] CRAN (R 4.1.0)
#>  htmlwidgets   1.5.4   2021-09-08 [1] CRAN (R 4.1.0)
#>  httr          1.4.2   2020-07-20 [1] CRAN (R 4.1.0)
#>  jquerylib     0.1.4   2021-04-26 [1] CRAN (R 4.1.0)
#>  jsonlite      1.7.3   2022-01-17 [1] CRAN (R 4.1.2)
#>  knitr         1.37    2021-12-16 [1] CRAN (R 4.1.0)
#>  lazyeval      0.2.2   2019-03-15 [2] CRAN (R 4.1.0)
#>  lifecycle     1.0.1   2021-09-24 [1] CRAN (R 4.1.0)
#>  lubridate     1.8.0   2021-10-07 [1] CRAN (R 4.1.0)
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.1.2)
#>  memoise       2.0.0   2021-01-26 [2] CRAN (R 4.1.0)
#>  modelr        0.1.8   2020-05-19 [1] CRAN (R 4.1.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.1.0)
#>  pillar        1.7.0   2022-02-01 [1] CRAN (R 4.1.2)
#>  pkgbuild      1.2.0   2020-12-15 [2] CRAN (R 4.1.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.1.0)
#>  pkgload       1.2.4   2021-11-30 [1] CRAN (R 4.1.0)
#>  plotly      * 4.9.4.1 2021-06-18 [2] CRAN (R 4.1.0)
#>  prettyunits   1.1.1   2020-01-24 [1] CRAN (R 4.1.0)
#>  processx      3.5.2   2021-04-30 [1] CRAN (R 4.1.0)
#>  ps            1.6.0   2021-02-28 [1] CRAN (R 4.1.0)
#>  purrr       * 0.3.4   2020-04-17 [1] CRAN (R 4.1.0)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.1.0)
#>  Rcpp          1.0.8.3 2022-03-17 [1] CRAN (R 4.1.2)
#>  readr       * 2.1.2   2022-01-30 [1] CRAN (R 4.1.2)
#>  readxl        1.3.1   2019-03-13 [1] CRAN (R 4.1.0)
#>  remotes       2.4.0   2021-06-02 [2] CRAN (R 4.1.0)
#>  reprex        2.0.1   2021-08-05 [1] CRAN (R 4.1.0)
#>  rlang         1.0.2   2022-03-04 [1] CRAN (R 4.1.2)
#>  rmarkdown     2.11    2021-09-14 [1] CRAN (R 4.1.0)
#>  rprojroot     2.0.2   2020-11-15 [2] CRAN (R 4.1.0)
#>  rstudioapi    0.13    2020-11-12 [1] CRAN (R 4.1.0)
#>  rvest         1.0.2   2021-10-16 [1] CRAN (R 4.1.0)
#>  sass          0.4.0   2021-05-12 [1] CRAN (R 4.1.0)
#>  scales        1.2.0   2022-04-13 [1] CRAN (R 4.1.3)
#>  sessioninfo   1.1.1   2018-11-05 [2] CRAN (R 4.1.0)
#>  stringi       1.7.6   2021-11-29 [1] CRAN (R 4.1.0)
#>  stringr     * 1.4.0   2019-02-10 [1] CRAN (R 4.1.0)
#>  testthat      3.1.2   2022-01-20 [1] CRAN (R 4.1.2)
#>  tibble      * 3.1.6   2021-11-07 [1] CRAN (R 4.1.0)
#>  tidyr       * 1.2.0   2022-02-01 [1] CRAN (R 4.1.2)
#>  tidyselect    1.1.2   2022-02-21 [1] CRAN (R 4.1.2)
#>  tidyverse   * 1.3.1   2021-04-15 [1] CRAN (R 4.1.0)
#>  tzdb          0.1.2   2021-07-20 [2] CRAN (R 4.1.0)
#>  usethis       2.0.1   2021-02-10 [2] CRAN (R 4.1.0)
#>  utf8          1.2.2   2021-07-24 [1] CRAN (R 4.1.0)
#>  vctrs         0.4.0   2022-03-30 [1] CRAN (R 4.1.2)
#>  viridisLite   0.4.0   2021-04-13 [1] CRAN (R 4.1.0)
#>  withr         2.5.0   2022-03-03 [1] CRAN (R 4.1.2)
#>  xfun          0.29    2021-12-14 [1] CRAN (R 4.1.0)
#>  xml2          1.3.3   2021-11-30 [1] CRAN (R 4.1.0)
#>  yaml          2.2.2   2022-01-25 [1] CRAN (R 4.1.2)
#>
#> [1] /Users/sebastiansaueruser/Library/R/x86_64/4.1/library
#> [2] /Library/Frameworks/R.framework/Versions/4.1/Resources/library``````