code: def tile_cross_validation(
      cv_results: List[CVResult],
      show_arm_details_on_hover: bool = True,
      show_context: bool = True,
      label_dict: Optional[Dict[str, str]] = None,
  ) -> AxPlotConfig:
      """Tile version of CV plots; sorted by 'best fitting' outcomes.
  
      Plots are sorted in decreasing order using the p-value of a Fisher exact
      test statistic.
  
      Args:
          cv_results: cross-validation results.
          include_measurement_error: if True, include
              measurement_error metrics in plot.
          show_arm_details_on_hover: if True, display
              parameterizations of arms on hover. Default is True.
          show_context: if True (default), display context on
              hover.
          label_dict: optional map from real metric names to shortened names
  
      Returns a plotly.graph_objects.Figure
      """
      data = _get_cv_plot_data(cv_results, label_dict=label_dict)
      metrics = data.metrics
  
      # make subplots (2 plots per row)
      nrows = int(np.ceil(len(metrics) / 2))
      ncols = min(len(metrics), 2)
      fig = subplots.make_subplots(
          rows=nrows,
          cols=ncols,
          print_grid=False,
          subplot_titles=tuple(metrics),
          horizontal_spacing=0.15,
          vertical_spacing=0.30 / nrows,
      )
  
      for i, metric in enumerate(metrics):
          y_hat = []
          se_hat = []
          y_raw = []
          se_raw = []
          for arm in data.in_sample.values():
              y_hat.append(arm.y_hat[metric])
              se_hat.append(arm.se_hat[metric])
              y_raw.append(arm.y[metric])
              se_raw.append(arm.se[metric])
          min_, max_ = _get_min_max_with_errors(
              y_raw, y_hat, se_raw, se_hat
          )
          fig.append_trace(  # pyre-ignore[16]
              _diagonal_trace(min_, max_),
              int(np.floor(i / 2)) + 1,
              i % 2 + 1,
          )
          fig.append_trace(
              _error_scatter_trace(
                  list(data.in_sample.values()),
                  y_axis_var=PlotMetric(metric, pred=True, rel=False),
                  x_axis_var=PlotMetric(metric, pred=False, rel=False),
                  y_axis_label="Predicted",
                  x_axis_label="Actual",
                  hoverinfo="text",
                  show_arm_details_on_hover=show_arm_details_on_hover,
                  show_context=show_context,
              ),
              int(np.floor(i / 2)) + 1,
              i % 2 + 1,
          )
  
      # if odd number of plots, need to manually remove the last blank subplot
      # generated by `subplots.make_subplots`
      if len(metrics) % 2 == 1:
          fig["layout"].pop("xaxis{}".format(nrows * ncols))
          fig["layout"].pop("yaxis{}".format(nrows * ncols))
  
      # allocate 400 px per plot (equal aspect ratio)
      fig["layout"].update(
          title="Cross-Validation",  # What should I replace this with?
          hovermode="closest",
          width=800,
          height=400 * nrows,
          font={"size": 10},
          showlegend=False,
      )
  
      # update subplot title size and the axis labels
      for i, ant in enumerate(fig["layout"]["annotations"]):
          ant["font"].update(size=12)
          fig["layout"]["xaxis{}".format(i + 1)].update(
              title="Actual Outcome",
              mirror=True,
              linecolor="black",
              linewidth=0.5,
          )
          fig["layout"]["yaxis{}".format(i + 1)].update(
              title="Predicted Outcome",
              mirror=True,
              linecolor="black",
              linewidth=0.5,
          )
  
      return AxPlotConfig(data=fig, plot_type=AxPlotTypes.GENERIC)
  
imports: from copy import deepcopy
  from typing import Any, Dict, List, Optional, Tuple
  import numpy
  import plotly.graph_objs
  from ax.core.batch_trial import BatchTrial
  from ax.core.data import Data
  from ax.core.experiment import Experiment
  from ax.core.multi_type_experiment import MultiTypeExperiment
  from ax.core.observation import Observation
  from ax.modelbridge.cross_validation import CVResult
  from ax.modelbridge.transforms.convert_metric_names import convert_mt_observations
  from ax.plot.base import AxPlotConfig, AxPlotTypes, PlotData, PlotInSampleArm, PlotMetric, Z
  from ax.plot.helper import compose_annotation
  from ax.plot.scatter import _error_scatter_data, _error_scatter_trace
  from ax.utils.common.typeutils import not_none
  from plotly import subplots
label_desc: Use image node_id 9 for calling a global function with example usage: tile_cross_validation(cv_results, show_arm_details_on_hover, show_context, label_dict) and returns: AxPlotConfig