code: def plot_multiple_pareto_frontiers(
      frontiers: Dict[str, ParetoFrontierResults],
      CI_level: float = DEFAULT_CI_LEVEL,
      show_parameterization_on_hover: bool = True,
  ) -> AxPlotConfig:
      """Plot a Pareto frontier from a ParetoFrontierResults object.
  
      Args:
          frontiers (Dict[str, ParetoFrontierResults]): The results of
              the Pareto frontier computation.
          CI_level (float, optional): The confidence level, i.e. 0.95 (95%)
          show_parameterization_on_hover (bool, optional): If True, show the
              parameterization of the points on the frontier on hover.
  
      Returns:
          AEPlotConfig: The resulting Plotly plot definition.
  
      """
      first_frontier = list(frontiers.values())[0]
      traces = []
      for i, (method, frontier) in enumerate(frontiers.items()):
          # Check the two metrics are the same as the first frontier
          if (
              frontier.primary_metric != first_frontier.primary_metric
              or frontier.secondary_metric
              != first_frontier.secondary_metric
          ):
              raise ValueError(
                  "All frontiers should have the same pairs of metrics."
              )
  
          trace = _get_single_pareto_trace(
              frontier=frontier,
              legend_label=method,
              trace_color=DISCRETE_COLOR_SCALE[
                  i % len(DISCRETE_COLOR_SCALE)
              ],
              CI_level=CI_level,
              show_parameterization_on_hover=show_parameterization_on_hover,
          )
  
          traces.append(trace)
  
      shapes = []
      primary_threshold = None
      secondary_threshold = None
      if frontier.objective_thresholds is not None:
          primary_threshold = frontier.objective_thresholds.get(
              frontier.primary_metric, None
          )
          secondary_threshold = frontier.objective_thresholds.get(
              frontier.secondary_metric, None
          )
      absolute_metrics = frontier.absolute_metrics
      rel_x = frontier.secondary_metric not in absolute_metrics
      rel_y = frontier.primary_metric not in absolute_metrics
      if primary_threshold is not None:
          shapes.append(
              {
                  "type": "line",
                  "xref": "paper",
                  "x0": 0.0,
                  "x1": 1.0,
                  "yref": "y",
                  "y0": primary_threshold,
                  "y1": primary_threshold,
                  "line": {
                      "color": rgba(COLORS.CORAL.value),
                      "width": 3,
                  },
              }
          )
      if secondary_threshold is not None:
          shapes.append(
              {
                  "type": "line",
                  "yref": "paper",
                  "y0": 0.0,
                  "y1": 1.0,
                  "xref": "x",
                  "x0": secondary_threshold,
                  "x1": secondary_threshold,
                  "line": {
                      "color": rgba(COLORS.CORAL.value),
                      "width": 3,
                  },
              }
          )
  
      layout = go.Layout(
          title="Pareto Frontier",
          xaxis={
              "title": frontier.secondary_metric,
              "ticksuffix": "%" if rel_x else "",
              "zeroline": True,
          },
          yaxis={
              "title": frontier.primary_metric,
              "ticksuffix": "%" if rel_y else "",
              "zeroline": True,
          },
          hovermode="closest",
          legend={
              "orientation": "h",
              "yanchor": "top",
              "y": -0.20,
              "xanchor": "auto",
              "x": 0.075,
          },
          width=750,
          height=550,
          margin=go.layout.Margin(
              pad=4, l=225, b=125, t=75
          ),  # noqa E741
          shapes=shapes,
      )
  
      fig = go.Figure(data=traces, layout=layout)
      return AxPlotConfig(data=fig, plot_type=AxPlotTypes.GENERIC)
  
imports: import warnings
  from typing import Dict, Iterable, List, Optional, Tuple, Union
  import numpy
  import pandas
  import plotly.graph_objs
  from ax.core.experiment import Experiment
  from ax.core.objective import MultiObjective
  from ax.core.optimization_config import MultiObjectiveOptimizationConfig, OptimizationConfig
  from ax.core.outcome_constraint import ObjectiveThreshold
  from ax.exceptions.core import UserInputError
  from ax.plot.base import AxPlotConfig, AxPlotTypes, CI_OPACITY, DECIMALS
  from ax.plot.color import COLORS, DISCRETE_COLOR_SCALE, rgba
  from ax.plot.helper import _format_CI, _format_dict, extend_range
  from ax.plot.pareto_utils import ParetoFrontierResults
  from ax.service.utils.best_point_mixin import BestPointMixin
  from ax.utils.common.typeutils import checked_cast, not_none
  from plotly import express
  from scipy.stats import norm
label_desc: Use image node_id 8 for calling a global function with example usage: plot_multiple_pareto_frontiers(frontiers, CI_level, show_parameterization_on_hover) and returns: AxPlotConfig