//  [python]
def plot(
        self, 
        models="all",
        exclude = [],
        order_by=None, 
        ci=False,
        ax = None,
        figsize=(12,6),
    ):
        """ Plots all forecasts with the actuals, or just actuals if no forecasts have been evaluated or are selected.

        Args:
            models (list-like, str, or None): Default 'all'.
               The forecasted models to plot.
               Can start with "top_" and the metric specified in order_by will be used to order the models appropriately.
               If None or models/order_by combo invalid, will plot only actual values.
            exclude (collection): Default []. Pass any models here that you don't want displayed.
                Good to use in conjunction with models = 'top_{n}'. 
            order_by (str): Optional. One of Forecaster.determine_best_by.  
                How to order the display of forecasts on the plots (from best-to-worst according to the selected metric).
            ci (bool): Default False.
                Whether to display the confidence intervals.
            ax (Axis): Optional. The existing axis to write the resulting figure to.
            figsize (tuple): Default (12,6). The size of the resulting figure. Ignored when ax is not None.

        Returns:
            (Axis): The figure's axis.

        >>> models = ('mlr','mlp','lightgbm')
        >>> f.tune_test_forecast(models,dynamic_testing=False,feature_importance=True)
        >>> f.plot(order_by='TestSetRMSE') # plots all forecasts
        >>> plt.show()
        """
        try:
            models = [m for m in self._parse_models(models, order_by) if m not in exclude]
        except (ValueError, TypeError):
            models = None

        if ax is None:
            _, ax = plt.subplots(figsize=figsize)

        if models is None:
            s.plot(
                x=self.current_dates.values, 
                y=self.y.values, 
                label="actuals", 
                ax=ax
            )
        else:
            y = self.y.dropna().values
            plot = {
                "date": self.current_dates.values[-len(y) :],
                "actuals": y,
            }
            plot["actuals_len"] = min(len(plot["date"]), len(plot["actuals"]))

            s.plot(
                x=plot["date"][-plot["actuals_len"] :],
                y=plot["actuals"][-plot["actuals_len"] :],
                label="actuals",
                ax=ax,
            )
            for i, m in enumerate(models):
                plot[m] = (self.history[m]["Forecast"])
                if plot[m] is None or not len(plot[m]):
                    continue
                s.plot(
                    x=self.future_dates.to_list(),
                    y=plot[m],
                    color=__colors__[i],
                    label=m,
                    ax=ax,
                )
                if ci:
                    try:
                        ax.fill_between(
                            x=self.future_dates.values,
                            y1=self.history[m]["UpperCI"],
                            y2=self.history[m]["LowerCI"],
                            alpha=0.2,
                            color=__colors__[i],
                            label="{} {:.0%} CI".format(m, self.history[m]["CILevel"]),
                        )
                    except KeyError:
                        _developer_utils._warn_about_not_finding_cis(m)
        
        ax.legend()
        ax.set_xlabel("Date")
        ax.set_ylabel("Values")
        return ax