class_docstr: Plotting object allows for visualization of absolute group bias metrics and
  relative disparities calculated by Aequitas Group(), Bias(), and Fairness()
  class instances.
docstr: Plot a single group metric across all attribute groups for multiple models.
  
  :param group_table: group table. Output of of group.get_crosstabs() or
      bias.get_disparity functions.
  :param group_metric: the metric to plot. Must be a column in the group_table.
  :param ncols: The number of subplots to plot per row visualization
      figure.
      Default is 3.
  :param title: whether to include a title in visualizations. Default is True.
  :param label_dict: optional, dictionary of replacement labels for data.
      Default is None.
  :param show_figure: Whether to show figure (plt.show()). Default is
      True.
  :param selected_models: which models to visualize. Default is all models in group_table.
  :param min_group_size: minimum size for groups to include in visualization
      (as a proportion of total sample).
  :return: A Matplotlib axis
code: def multimodel_plot_group_metric(
      self,
      group_table,
      group_metric,
      ncols=3,
      title=True,
      label_dict=None,
      show_figure=True,
      selected_models=None,
      min_group_size=None,
  ):
      """
      Plot a single group metric across all attribute groups for multiple models.
  
      :param group_table: group table. Output of of group.get_crosstabs() or
          bias.get_disparity functions.
      :param group_metric: the metric to plot. Must be a column in the group_table.
      :param ncols: The number of subplots to plot per row visualization
          figure.
          Default is 3.
      :param title: whether to include a title in visualizations. Default is True.
      :param label_dict: optional, dictionary of replacement labels for data.
          Default is None.
      :param show_figure: Whether to show figure (plt.show()). Default is
          True.
      :param selected_models: which models to visualize. Default is all models in group_table.
      :param min_group_size: minimum size for groups to include in visualization
          (as a proportion of total sample).
      :return: A Matplotlib axis
      """
      # requirement: at least two model_id values
      df_models = self._check_multiple_models(
          group_table, method_table_name="group_table"
      )
  
      if not selected_models:
          selected_models = df_models
  
      plot_table = group_table.loc[
          group_table["model_id"].isin(selected_models)
      ]
  
      num_metrics = len(df_models)
  
      total_plot_width = 25
  
      fig, axs, rows, axes_to_remove = self.generate_axes(
          ncols=ncols,
          num_metrics=num_metrics,
          total_plot_width=total_plot_width,
          sharey=True,
      )
  
      # set a different distribution to be plotted in each subplot
      ax_col = -1
      ax_row = 0
      col_num = 0
  
      for model in df_models:
          if (
              plot_table.loc[
                  plot_table["model_id"] == model, group_metric
              ]
              .isnull()
              .all()
          ):
              logging.warning(
                  f"Cannot plot metric '{group_metric}', only NaN values."
              )
              axes_to_remove += 1
              continue
  
          elif (
              plot_table.loc[
                  plot_table["model_id"] == model, group_metric
              ]
              .isnull()
              .any()
          ):
              # determine which group(s) have missing values
              missing = ", ".join(
                  plot_table.loc[
                      (plot_table["model_id"] == model)
                      & (plot_table[group_metric].isnull()),
                      "attribute_value",
                  ].values.tolist()
              )
  
              attr = ", ".join(
                  plot_table.loc[
                      (plot_table["model_id"] == model)
                      & (plot_table[group_metric].isnull()),
                      "attribute_name",
                  ].values.tolist()
              )
  
              logging.warning(
                  f"Model {model} '{attr}' group '{missing}' value for metric "
                  f"'{group_metric}' is NA, group not included in visualization."
              )
              plot_table = plot_table.dropna(
                  axis=0, subset=[group_metric]
              )
  
              model_table = plot_table.loc[
                  plot_table["model_id"] == model
              ]
  
          else:
              model_table = plot_table.loc[
                  plot_table["model_id"] == model
              ]
  
          current_subplot, ax_row, ax_col = self.iterate_subplots(
              axs, ncols, rows, ax_col, ax_row
          )
  
          self.plot_group_metric(
              group_table=model_table,
              group_metric=group_metric,
              ax=current_subplot,
              ax_lim=None,
              title=title,
              label_dict=label_dict,
              min_group_size=min_group_size,
          )
  
          if title:
              current_subplot.set_title(
                  f"{group_metric.upper()} (Model {model})", fontsize=20
              )
  
          col_num += 1
  
      # disable axes not being used
      if axes_to_remove > 0:
          for i in np.arange(axes_to_remove):
              axs[-1, -(i + 1)].axis("off")
  
      if show_figure:
          plt.show()
  
      return fig
  
imports: import logging
  import math
  import numpy
  import collections
  import seaborn
  import matplotlib.pyplot
  import matplotlib.colors
  import matplotlib.cm
  from aequitas import squarify_flipped
label_desc: Use image node_id 9 for calling the Plot obj's underlying member method code with example usage: obj.multimodel_plot_group_metric(group_table, group_metric, ncols, title, label_dict, show_figure, selected_models, min_group_size) and returns: fig