docs: def _create_marks(fig, marks=[bq.Mark], options={}, params={}):
      """
      Initializes and returns marks for a figure as a list. Each mark is passed
      in as a class. The plot options should be passed into options.
  
      Any additional parameters to initialize plot components are passed into
      params as a dict of { 'mark': [{ trait: value, ... }, ...] }
  
      For example, when initializing two marks you can assign different colors to
      each one:
  
      params={
          'marks': [
              {'colors': [DARK_BLUE]},
              {'colors': [GOLDENROD]},
          ]
      }
  
      If the param value is a function, it will be called with the options dict
      augmented with all previously created plot elements. This permits
      dependencies on plot elements:
      params={ 'marks': {'scale': lambda opts: opts['x_sc'] } }
      """
      params = _merge_with_defaults(params)
  
      # Although fig provides scale_x and scale_y properties, the scales on the
      # axes are the only ones that are actually used.
      x_ax, y_ax = fig.axes
      x_sc, y_sc = x_ax.scale, y_ax.scale
  
      options = tz.merge(options, {'x_sc': x_sc, 'y_sc': y_sc})
  
      marks = [
          mark_cls(**_call_params(mark_params, options))
          for mark_cls, mark_params in zip(marks, params['marks'])
      ]
      return marks