code: def plot_mean_quantile_returns_spread_time_series(
      mean_returns_spread, std_err=None, bandwidth=1, ax=None
  ):
      """
      Plots mean period wise returns for factor quantiles.
  
      Parameters
      ----------
      mean_returns_spread : pd.Series
          Series with difference between quantile mean returns by period.
      std_err : pd.Series
          Series with standard error of difference between quantile
          mean returns each period.
      bandwidth : float
          Width of displayed error bands in standard deviations.
      ax : matplotlib.Axes, optional
          Axes upon which to plot.
  
      Returns
      -------
      ax : matplotlib.Axes
          The axes that were plotted on.
      """
  
      if isinstance(mean_returns_spread, pd.DataFrame):
          if ax is None:
              ax = [None for a in mean_returns_spread.columns]
  
          ymin, ymax = (None, None)
          for (i, a), (name, fr_column) in zip(
              enumerate(ax), mean_returns_spread.iteritems()
          ):
              stdn = None if std_err is None else std_err[name]
              a = plot_mean_quantile_returns_spread_time_series(
                  fr_column, std_err=stdn, ax=a
              )
              ax[i] = a
              curr_ymin, curr_ymax = a.get_ylim()
              ymin = curr_ymin if ymin is None else min(ymin, curr_ymin)
              ymax = curr_ymax if ymax is None else max(ymax, curr_ymax)
  
          for a in ax:
              a.set_ylim([ymin, ymax])
  
          return ax
  
      if mean_returns_spread.isnull().all():
          return ax
  
      periods = mean_returns_spread.name
      title = "Top Minus Bottom Quantile Mean Return ({} Period Forward Return)".format(
          periods if periods is not None else ""
      )
  
      if ax is None:
          f, ax = plt.subplots(figsize=(18, 6))
  
      mean_returns_spread_bps = mean_returns_spread * DECIMAL_TO_BPS
  
      mean_returns_spread_bps.plot(
          alpha=0.4, ax=ax, lw=0.7, color="forestgreen"
      )
      mean_returns_spread_bps.rolling(window=22).mean().plot(
          color="orangered", alpha=0.7, ax=ax
      )
      ax.legend(
          ["mean returns spread", "1 month moving avg"],
          loc="upper right",
      )
  
      if std_err is not None:
          std_err_bps = std_err * DECIMAL_TO_BPS
          upper = mean_returns_spread_bps.values + (
              std_err_bps * bandwidth
          )
          lower = mean_returns_spread_bps.values - (
              std_err_bps * bandwidth
          )
          ax.fill_between(
              mean_returns_spread.index,
              lower,
              upper,
              alpha=0.3,
              color="steelblue",
          )
  
      ylim = np.nanpercentile(abs(mean_returns_spread_bps.values), 95)
      ax.set(
          ylabel="Difference In Quantile Mean Return (bps)",
          xlabel="",
          title=title,
          ylim=(-ylim, ylim),
      )
      ax.axhline(0.0, linestyle="-", color="black", lw=1, alpha=0.8)
  
      return ax
  
imports: import numpy
  import pandas
  from scipy import stats
  import statsmodels.api
  import seaborn
  import matplotlib.cm
  import matplotlib.pyplot
  from matplotlib.ticker import ScalarFormatter
  from functools import wraps
  from .None import utils
  from .None import performance
label_desc: Use image node_id 13 for calling a global function with example usage: plot_mean_quantile_returns_spread_time_series(mean_returns_spread, std_err, bandwidth, ax) and returns: ax, ax, ax