code: def plot_multivariate(
      df,
      x_col,
      y_col_style_dict="plotly",
      default_color="rgba(0, 145, 202, 1.0)",
      xlabel=None,
      ylabel=cst.VALUE_COL,
      title=None,
      showlegend=True,
  ):
      """Plots one or more lines against the same x-axis values.
  
      Parameters
      ----------
      df : `pandas.DataFrame`
          Data frame with ``x_col`` and columns named by the keys in ``y_col_style_dict``.
      x_col: `str`
          Which column to plot on the x-axis.
      y_col_style_dict: `dict` [`str`, `dict` or None] or "plotly" or "auto" or "auto-fill", default "plotly"
          The column(s) to plot on the y-axis, and how to style them.
  
          If a dictionary:
  
              - key : `str`
                  column name in ``df``
              - value : `dict` or None
                  Optional styling options, passed as kwargs to `go.Scatter`.
                  If None, uses the default: line labeled by the column name.
                  See reference page for `plotly.graph_objects.Scatter` for options
                  (e.g. color, mode, width/size, opacity).
                  https://plotly.com/python/reference/#scatter.
  
          If a string, plots all columns in ``df`` besides ``x_col`` against ``x_col``:
  
              - "plotly": plot lines with default plotly styling
              - "auto": plot lines with color ``default_color``, sorted by value (ascending)
              - "auto-fill": plot lines with color ``default_color``, sorted by value (ascending), and fills between lines
  
      default_color: `str`, default "rgba(0, 145, 202, 1.0)" (blue)
          Default line color when ``y_col_style_dict`` is one of "auto", "auto-fill".
      xlabel : `str` or None, default None
          x-axis label. If None, default is ``x_col``.
      ylabel : `str` or None, default ``VALUE_COL``
          y-axis label
      title : `str` or None, default None
          Plot title. If None, default is based on axis labels.
      showlegend : `bool`, default True
          Whether to show the legend.
  
      Returns
      -------
      fig : `plotly.graph_objects.Figure`
          Interactive plotly graph of one or more columns
          in ``df`` against ``x_col``.
  
          See `~greykite.common.viz.timeseries_plotting.plot_forecast_vs_actual`
          return value for how to plot the figure and add customization.
      """
  
      if xlabel is None:
          xlabel = x_col
      if title is None and ylabel is not None:
          title = f"{ylabel} vs {xlabel}"
  
      auto_style = {"line": {"color": default_color}}
      if y_col_style_dict == "plotly":
          # Uses plotly default style
          y_col_style_dict = {
              col: None for col in df.columns if col != x_col
          }
      elif y_col_style_dict in ["auto", "auto-fill"]:
          # Columns ordered from low to high
          means = df.drop(columns=x_col).mean()
          column_order = list(means.sort_values().index)
          if y_col_style_dict == "auto":
              # Lines with color `default_color`
              y_col_style_dict = {
                  col: auto_style for col in column_order
              }
          elif y_col_style_dict == "auto-fill":
              # Lines with color `default_color`, with fill between lines
              y_col_style_dict = {column_order[0]: auto_style}
              y_col_style_dict.update(
                  {
                      col: {
                          "line": {"color": default_color},
                          "fill": "tonexty",
                      }
                      for col in column_order[1:]
                  }
              )
  
      data = []
      default_style = dict(mode="lines")
      for column, style_dict in y_col_style_dict.items():
          # By default, column name in ``df`` is used to label the line
          default_col_style = update_dictionary(
              default_style, overwrite_dict={"name": column}
          )
          # User can overwrite any of the default values, or remove them by setting key value to None
          style_dict = update_dictionary(
              default_col_style, overwrite_dict=style_dict
          )
          line = go.Scatter(x=df[x_col], y=df[column], **style_dict)
          data.append(line)
  
      layout = go.Layout(
          xaxis=dict(title=xlabel),
          yaxis=dict(title=ylabel),
          title=title,
          title_x=0.5,
          showlegend=showlegend,
          legend={
              "traceorder": "reversed"
          },  # Matches the order of ``y_col_style_dict`` (bottom to top)
      )
      fig = go.Figure(data=data, layout=layout)
      return fig
  
imports: import warnings
  import numpy
  import pandas
  import plotly.graph_objects
  from plotly.colors import DEFAULT_PLOTLY_COLORS
  from plotly.subplots import make_subplots
  from greykite.common import constants
  from greykite.common.features.timeseries_features import build_time_features_df
  from greykite.common.logging import LoggingLevelEnum
  from greykite.common.logging import log_message
  from greykite.common.python_utils import update_dictionary
  from greykite.common.viz.colors_utils import get_color_palette
  from greykite.common.viz.colors_utils import get_distinct_colors
label_desc: Use image node_id 1 for calling a global function with example usage: plot_multivariate(df, x_col, y_col_style_dict, default_color, xlabel, ylabel, title, showlegend) and returns: fig