class_docstr: Base class for all positions
code: def _collide_setup(cls, data, params):
      xminmax = ["xmin", "xmax"]
      width = params.get("width", None)
  
      # Determine width
      if width is not None:
          # Width set manually
          if not all(col in data.columns for col in xminmax):
              data["xmin"] = data["x"] - width / 2
              data["xmax"] = data["x"] + width / 2
      else:
          if not all(col in data.columns for col in xminmax):
              data["xmin"] = data["x"]
              data["xmax"] = data["x"]
  
          # Width determined from data, must be floating point constant
          widths = (data["xmax"] - data["xmin"]).drop_duplicates()
          widths = widths[~np.isnan(widths)]
          width = widths.iloc[0]
  
      return data, width
  
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 9 for calling the position obj's underlying member method code with example usage: obj._collide_setup(cls, data, params) and returns: data,  width