class_docstr: Dodge and jitter to minimise overlap
  
  Useful when aligning points generated through
  [](`~plotnine.geoms.geom_point`) with dodged a
  [](`~plotnine.geoms.geom_boxplot`).
  
  Parameters
  ----------
  jitter_width :
      Proportion to jitter in horizontal direction.
      If `None`, `0.4` of the resolution of the data.
  jitter_height :
      Proportion to jitter in vertical direction.
  dodge_width :
      Amount to dodge in horizontal direction.
  random_state :
      Seed or Random number generator to use. If `None`, then
      numpy global generator :class:`numpy.random` is used.
code: def setup_params(self, data):
      params = copy(self.params)
      width = params["jitter_width"]
      if width is None:
          width = resolution(data["x"]) * 0.4
  
      # Adjust the x transformation based on the number
      # of dodge variables
      dvars = SCALED_AESTHETICS - self.REQUIRED_AES
      dodge_columns = data.columns.intersection(list(dvars))
      if len(dodge_columns) == 0:
          raise PlotnineError(
              "'position_jitterdodge' requires at least one "
              "aesthetic to dodge by."
          )
  
      s = set()
      for col in dodge_columns:
          with suppress(AttributeError):
              s.update(data[col].cat.categories)
      ndodge = len(s)
  
      params["jitter_width"] = width / (ndodge + 2)
      params["width"] = params["dodge_width"]
      return params
  
file_path: plotnine/plotnine/positions/position_jitterdodge.py
imports: from __future__ import annotations
  import typing
  from contextlib import suppress
  from copy import copy
  from .._utils import jitter, resolution
  from ..exceptions import PlotnineError
  from ..mapping.aes import SCALED_AESTHETICS
  from .position import position
  from .position_dodge import position_dodge
label_desc: Use image node_id 2 for calling the position_jitterdodge obj's underlying member method code with example usage: obj.setup_params(data) and returns: params