code: def _rtreeviz_bivar_3D(
      shadow_tree,
      fontsize,
      ticks_fontsize,
      fontname,
      azim,
      elev,
      dist,
      show,
      colors,
      markersize,
      n_colors_in_map,
      features,
      figsize,
      ax,
  ):
      X_train = shadow_tree.X_train
      y_train = shadow_tree.y_train
  
      if ax is None:
          if figsize:
              fig = plt.figure(figsize=figsize)
          else:
              fig = plt.figure()
          ax = fig.add_subplot(111, projection="3d")
      colors = adjust_colors(colors)
      ax.view_init(elev=elev, azim=azim)
      ax.dist = dist
  
      def y_to_color_index(y):
          y_range = y_lim[1] - y_lim[0]
          return int(((y - y_lim[0]) / y_range) * (n_colors_in_map - 1))
  
      def plane(node, bbox, color_spectrum):
          x = np.linspace(bbox[0], bbox[2], 2)
          y = np.linspace(bbox[1], bbox[3], 2)
          xx, yy = np.meshgrid(x, y)
          z = np.full(xx.shape, node.prediction())
          ax.plot_surface(
              xx,
              yy,
              z,
              alpha=colors["tessellation_alpha_3D"],
              shade=False,
              color=color_spectrum[y_to_color_index(node.prediction())],
              edgecolor=colors["edge"],
              lw=0.3,
          )
  
      y_lim = np.min(y_train), np.max(y_train)
      color_spectrum = Color(colors["color_map_min"]).range_to(
          Color(colors["color_map_max"]), n_colors_in_map
      )
      color_spectrum = [
          rgb2hex(c.rgb, force_long=True) for c in color_spectrum
      ]
      y_colors = [color_spectrum[y_to_color_index(y)] for y in y_train]
  
      featidx = [shadow_tree.feature_names.index(f) for f in features]
  
      if not is_numeric(X_train[:, featidx[0]]) or not is_numeric(
          X_train[:, featidx[1]]
      ):
          raise ValueError(
              f"rtree_feature_space3D only supports numeric feature spaces"
          )
  
      x, y, z = X_train[:, featidx[0]], X_train[:, featidx[1]], y_train
      tessellation = tessellate(shadow_tree.root, X_train, featidx)
  
      for node, bbox in tessellation:
          plane(node, bbox, color_spectrum)
  
      ax.scatter(
          x,
          y,
          z,
          marker="o",
          alpha=colors["scatter_marker_alpha"],
          edgecolor=colors["scatter_edge"],
          lw=0.3,
          c=y_colors,
          s=markersize,
      )
  
      _format_axes(
          ax,
          shadow_tree.feature_names[featidx[0]],
          shadow_tree.feature_names[featidx[1]],
          colors,
          fontsize,
          fontname,
          ticks_fontsize=ticks_fontsize,
          grid=False,
      )
      ax.set_zlabel(
          f"{shadow_tree.target_name}",
          fontsize=fontsize,
          fontname=fontname,
          color=colors["axis_label"],
      )
  
      if "title" in show:
          accur = shadow_tree.get_score()
          title = f"Regression Tree Depth {shadow_tree.get_max_depth()}, Training $R^2$={accur:.3f}"
          ax.set_title(title, fontsize=fontsize, color=colors["title"])
  
      return None
  
imports: import os
  import tempfile
  from typing import Mapping, List, Callable
  import matplotlib
  import matplotlib.patches
  import matplotlib.pyplot
  import numpy
  import pandas
  from colour import Color, rgb2hex
  from sklearn import tree
  from dtreeviz.colors import adjust_colors
  from dtreeviz.interpretation import explain_prediction_plain_english, explain_prediction_sklearn_default
  from dtreeviz.models.shadow_decision_tree import ShadowDecTree
  from dtreeviz.models.shadow_decision_tree import ShadowDecTreeNode
  from dtreeviz.utils import myround, DTreeVizRender, add_classifier_legend, _format_axes, _draw_wedge, _set_wedge_ticks, tessellate, is_numeric
label_desc: Use image node_id 15 for calling a global function with example usage: _rtreeviz_bivar_3D(shadow_tree, fontsize, ticks_fontsize, fontname, azim, elev, dist, show, colors, markersize, n_colors_in_map, features, figsize, ax) and returns: None, int