docs: def scatter_drag(
      x_points: 'Array',
      y_points: 'Array',
      *,
      fig=None,
      show_eqn=True,
      options={}
  ):
      """
      Generates an interactive scatter plot with the best fit line plotted over
      the points. The points can be dragged by the user and the line will
      automatically update.
  
      Args:
          x_points (Array Number): x-values of points to plot
  
          y_points (Array Number): y-values of points to plot
  
      Kwargs:
          show_eqn (bool): If True (default), displays the best fit line's
              equation above the scatterplot.
  
          {options}
  
      Returns:
          VBox with two children: the equation widget and the figure.
  
      >>> xs = np.arange(10)
      >>> ys = np.arange(10) + np.random.rand(10)
      >>> scatter_drag(xs, ys)
      VBox(...)
      """
      params = {
          'marks': [{
              'x': x_points,
              'y': y_points,
              'enable_move': True,
          }, {
              'colors': [GOLDENROD],
          }]
      }
      fig = options.get('_fig', False) or _create_fig(options=options)
      [scat, lin] = _create_marks(
          fig=fig, marks=[bq.Scatter, bq.Lines], options=options, params=params
      )
      _add_marks(fig, [scat, lin])
  
      equation = widgets.Label()
  
      # create line fit to data and display equation
      def update_line(change=None):
          x_sc = scat.scales['x']
          lin.x = [
              x_sc.min if x_sc.min is not None else np.min(scat.x),
              x_sc.max if x_sc.max is not None else np.max(scat.x),
          ]
          poly = np.polyfit(scat.x, scat.y, deg=1)
          lin.y = np.polyval(poly, lin.x)
          if show_eqn:
              equation.value = 'y = {:.2f}x + {:.2f}'.format(poly[0], poly[1])
  
      update_line()
  
      scat.observe(update_line, names=['x', 'y'])
  
      return widgets.VBox([equation, fig])