code: def plot_summary(self) -> dict:
      for bias_metric in self.bias_metrics_results.index:
          bias_metric_title = bias_metric.replace("_", " ").title()
          results = self.bias_metrics_results.loc[bias_metric]
          x_labels = []
          bar_results = []
          for group_name in results.index:
              if group_name == "female":
                  continue
              group_title, others_title = self.get_titles(group_name)
              x_labels.append(group_title + "\n" + others_title)
              bar_results.append(results[group_name])
  
          fig, ax = plt.subplots()
          bar_width = 0.2
          index = np.arange(len(bar_results))
          group_colors = []
          others_colors = []
          for i, r in enumerate(bar_results):
              confidence = r.bias_confidence
              if (
                  confidence is None
                  or confidence.p_value > BiasConfidence.alpha
              ):
                  group_colors.append("lightsteelblue")
                  others_colors.append("bisque")
              else:
                  group_colors.append("tab:blue")
                  others_colors.append("tab:orange")
          group_bar = ax.bar(
              x=index,
              height=[r.group_p for r in bar_results],
              width=bar_width,
              color=group_colors,
          )
          others_bar = ax.bar(
              x=index + bar_width,
              height=[r.others_p for r in bar_results],
              width=bar_width,
              color=others_colors,
          )
          ax.set_xticks(index + bar_width / 2)
          ax.set_xticklabels(x_labels)
          ax.set_ylabel(
              get_bias_metric_short_description(
                  get_bias_metric(bias_metric)
              )
          )
          biased = np.any(
              [
                  r.bias_confidence is not None
                  and r.bias_confidence.p_value <= BiasConfidence.alpha
                  for r in bar_results
              ]
          )
          for i, r in enumerate(bar_results):
              confidence = r.bias_confidence
              if (
                  confidence is None
                  or confidence.p_value > BiasConfidence.alpha
              ):
                  continue
              interval = confidence.get_interval()
              plt.plot(
                  (i + (bar_width / 2), i + (bar_width / 2)),
                  (
                      min(r.group_p, r.others_p) + interval / 2,
                      max(r.group_p, r.others_p) - interval / 2,
                  ),
                  "r_-",
                  color="black",
              )
          if biased:
              percents = int((1 - BiasConfidence.alpha) * 100)
              plt.title(
                  bias_metric_title
                  + "\n\n"
                  + "Intervals represents the {percents}% confidence min difference".format(
                      percents=percents
                  )
              )
          else:
              plt.title(bias_metric_title + "\n\n" + "No bias detected")
          plt.xticks(rotation=90)
          plt.show()
  
file_path: bias-detector/bias_detector/BiasReport.py
imports: import pandas
  import numpy
  from matplotlib import pyplot
  from bias_detector.BiasConfidence import BiasConfidence
  from bias_detector.BiasMetric import get_bias_metric_description, get_bias_metric, get_bias_metric_short_description
  from bias_detector.common import get_p_others, get_other_groups_names, races
label_desc: Use image node_id 6 for calling the BiasReport obj's underlying member method code with example usage: obj.plot_summary() without return types