code: def summary(
      shap_values, X_vald, model_file_path, learner_name, class_names
  ):
      fig = plt.gcf()
      classes = None
      if class_names is not None and len(class_names):
          classes = class_names
  
      shap.summary_plot(
          shap_values,
          X_vald,
          plot_type="bar",
          show=False,
          class_names=classes,
      )
      fig.tight_layout(pad=2.0)
      fig.savefig(
          os.path.join(
              model_file_path, f"{learner_name}_shap_summary.png"
          )
      )
      plt.close("all")
  
      vals = None
      if isinstance(shap_values, list):
          for sh in shap_values:
              v = np.abs(sh).mean(0)
              vals = v if vals is None else vals + v
      else:
          vals = np.abs(shap_values).mean(0)
      feature_importance = pd.DataFrame(
          list(zip(X_vald.columns, vals)),
          columns=["feature", "shap_importance"],
      )
      feature_importance.sort_values(
          by=["shap_importance"], ascending=False, inplace=True
      )
      feature_importance.to_csv(
          os.path.join(
              model_file_path, f"{learner_name}_shap_importance.csv"
          ),
          index=False,
      )
  
imports: import logging
  import os
  import matplotlib.pyplot
  import numpy
  import pandas
  import shap
  from sklearn.preprocessing import OneHotEncoder
  from supervised.algorithms.registry import BINARY_CLASSIFICATION, MULTICLASS_CLASSIFICATION, REGRESSION
  from supervised.utils.config import LOG_LEVEL
  import warnings
label_desc: Use image node_id 5 for calling the PlotSHAP obj's underlying member method code with example usage: obj.summary(shap_values, X_vald, model_file_path, learner_name, class_names) without return types