code: def plot_ecdf(df_list, colors, title):
      fig = go.Figure()
  
      for i, _df in enumerate(df_list):
          _abs_residuals = np.abs(_df["residuals"])
          _unique_abs_residuals = np.unique(_abs_residuals)
  
          fig.add_scatter(
              x=_unique_abs_residuals,
              y=1 - ecdf(_abs_residuals)(_unique_abs_residuals),
              line_shape="hv",
              name=_df.iloc[0, _df.columns.get_loc("label")],
              marker=dict(color=colors[i]),
          )
  
      fig.update_yaxes(
          {
              "type": "linear",
              "gridwidth": 2,
              "zeroline": False,
              "automargin": True,
              "ticks": "outside",
              "tickcolor": "white",
              "ticklen": 10,
              "fixedrange": True,
              "tickformat": ",.0%",
          }
      )
  
      fig.update_xaxes(
          {
              "type": "linear",
              "gridwidth": 2,
              "zeroline": False,
              "automargin": True,
              "ticks": "outside",
              "tickcolor": "white",
              "ticklen": 10,
              "fixedrange": True,
              "title_text": "|residual|",
          }
      )
  
      title = (
          "Reverse cumulative distribution of |residual|"
          if title is None
          else title
      )
      fig.update_layout(
          title_text=title,
          title_x=0.15,
          font={"color": "#371ea3"},
          template="none",
          margin={"t": 78, "b": 71, "r": 30},
      )
  
      return fig
  
imports: import numpy
  import pandas
  import plotly.graph_objects
label_desc: Use image node_id 2 for calling a global function with example usage: plot_ecdf(df_list, colors, title) and returns: fig