class_docstr: Vertical interval represented by a crossbar
  
  {usage}
  
  Parameters
  ----------
  {common_parameters}
  width : float, default=0.5
      Box width as a fraction of the resolution of the data.
  fatten : float, default=2
      A multiplicative factor used to increase the size of the
      middle bar across the box.
code: def draw_group(
      data: pd.DataFrame,
      panel_params: panel_view,
      coord: Coord,
      ax: Axes,
      **params: Any,
  ):
      y = data["y"]
      xmin = data["xmin"]
      xmax = data["xmax"]
      ymin = data["ymin"]
      ymax = data["ymax"]
      group = data["group"]
  
      # From violin
      notchwidth = typing.cast(float, params.get("notchwidth"))
      # ynotchupper = data.get('ynotchupper')
      # ynotchlower = data.get('ynotchlower')
  
      def flat(*args: pd.Series[Any]) -> npt.NDArray[Any]:
          """Flatten list-likes"""
          return np.hstack(args)
  
      middle = pd.DataFrame(
          {"x": xmin, "y": y, "xend": xmax, "yend": y, "group": group}
      )
      copy_missing_columns(middle, data)
      middle["alpha"] = 1
      middle["size"] *= params["fatten"]
  
      has_notch = "ynotchupper" in data and "ynotchlower" in data
      if has_notch:  # 10 points + 1 closing
          ynotchupper = data["ynotchupper"]
          ynotchlower = data["ynotchlower"]
  
          if any(ynotchlower < ymin) or any(ynotchupper > ymax):
              warn(
                  "Notch went outside the hinges. "
                  "Try setting notch=False.",
                  PlotnineWarning,
              )
  
          notchindent = (1 - notchwidth) * (xmax - xmin) / 2
  
          middle["x"] += notchindent
          middle["xend"] -= notchindent
          box = pd.DataFrame(
              {
                  "x": flat(
                      xmin,
                      xmin,
                      xmin + notchindent,
                      xmin,
                      xmin,
                      xmax,
                      xmax,
                      xmax - notchindent,
                      xmax,
                      xmax,
                      xmin,
                  ),
                  "y": flat(
                      ymax,
                      ynotchupper,
                      y,
                      ynotchlower,
                      ymin,
                      ymin,
                      ynotchlower,
                      y,
                      ynotchupper,
                      ymax,
                      ymax,
                  ),
                  "group": np.tile(np.arange(1, len(group) + 1), 11),
              }
          )
      else:
          # No notch, 4 points + 1 closing
          box = pd.DataFrame(
              {
                  "x": flat(xmin, xmin, xmax, xmax, xmin),
                  "y": flat(ymax, ymax, ymax, ymin, ymin),
                  "group": np.tile(np.arange(1, len(group) + 1), 5),
              }
          )
  
      copy_missing_columns(box, data)
      geom_polygon.draw_group(box, panel_params, coord, ax, **params)
      geom_segment.draw_group(middle, panel_params, coord, ax, **params)
  
file_path: plotnine/plotnine/geoms/geom_crossbar.py
imports: from __future__ import annotations
  import typing
  from warnings import warn
  import numpy
  import pandas
  from .._utils import SIZE_FACTOR, copy_missing_columns, resolution, to_rgba
  from ..doctools import document
  from ..exceptions import PlotnineWarning
  from .geom import geom
  from .geom_polygon import geom_polygon
  from .geom_segment import geom_segment
label_desc: Use image node_id 2 for calling the geom_crossbar obj's underlying member method code with example usage: obj.draw_group(data, panel_params, coord, ax) and returns: np