class_docstr: Base class for all positions
docstr: Positions must override this function
  
  Notes
  -----
  Make necessary adjustments to the columns in the dataframe.
  
  Create the position transformation functions and
  use self.transform_position() do the rest.
  
  See Also
  --------
  position_jitter.compute_panel
docstr_tok: ["Positions","must","override","this","function","Notes","--","--","-","Make","necessary","adjustments","to","the","columns","in","the","dataframe",".","Create","the","position","transformation","functions","and","use","self.transform_position","(",")","do","the","rest",".","See","Also","--","--","--","--","position_jitter.compute_panel"]
code: def compute_panel(
      cls,
      data: pd.DataFrame,
      scales: pos_scales,
      params: dict[str, Any],
  ) -> pd.DataFrame:
      """
      Positions must override this function
  
      Notes
      -----
      Make necessary adjustments to the columns in the dataframe.
  
      Create the position transformation functions and
      use self.transform_position() do the rest.
  
      See Also
      --------
      position_jitter.compute_panel
      """
      msg = "{} needs to implement this method"
      raise NotImplementedError(msg.format(cls.__name__))
  
imports: from __future__ import annotations
  import typing
  from abc import ABC
  from copy import copy
  from warnings import warn
  import numpy
  from .._utils import check_required_aesthetics, groupby_apply
  from .._utils.registry import Register, Registry
  from ..exceptions import PlotnineError, PlotnineWarning
  from ..mapping.aes import X_AESTHETICS, Y_AESTHETICS
label_desc: Use image node_id 5 for calling the position obj's underlying member method code with example usage: obj.compute_panel(cls, data, scales, params) without return types