mult_f <- function(b, c) b * c
pow_f <- function(b, c) b^c
values_b <- seq(0, 5, by = .01)
values_c <- seq(-.5, 3, by = .01)
mult_mat <- outer(values_b, values_c, mult_f)
pow_mat <- outer(values_b, values_c, pow_f)
pow_mat[is.infinite(pow_mat)] <- NA
opacity <- .3
z_min <- min(mult_mat, pow_mat, na.rm = TRUE)
z_max <- 5
plotly::plot_ly(
x = ~values_b,
y = ~values_c
) |>
plotly::add_surface(
z = ~ t(mult_mat),
contours = list(
z = list(
show = TRUE,
start = -1,
end = 1,
size = .1
)
),
name = "b*c",
showscale = FALSE,
opacity = opacity,
colorscale = list(c(0, 1), c("green", "green"))
) |>
plotly::add_surface(
opacity = opacity,
colorscale = list(c(0, 1), c("red", "red")),
z = ~ t(pow_mat),
contours = list(
z = list(
show = TRUE,
start = z_min,
end = z_max,
size = .2
)
),
showscale = FALSE,
name = "b^c"
) |>
plotly::layout(
scene = list(
xaxis = list(
# type = "log",
title = "First input, b"
),
yaxis = list(
# type = "log",
title = "Second input, c"
),
zaxis = list(
# type = "log",
range = c(z_min, z_max),
title = "outcome"
),
camera = list(eye = list(x = -1.25, y = -1.25, z = 0.5)),
aspectratio = list(x = .9, y = .8, z = 0.7)
)
)