class_docstr: An Overlay consists of multiple Elements (potentially of
  heterogeneous type) presented one on top each other with a
  particular z-ordering.
  
  Overlays along with elements constitute the only valid leaf types of
  a Layout and in fact extend the Layout structure. Overlays are
  constructed using the * operator (building an identical structure
  to the + operator).
code: def group(self):
      if self._group:
          return self._group
      elements = [el for el in self if not el._auxiliary_component]
      values = {el.group for el in elements}
      types = {type(el) for el in elements}
      if values:
          group = next(iter(values))
          vtype = next(iter(types)).__name__
      else:
          group, vtype = [], ""
      if len(values) == 1 and group != vtype:
          return group
      else:
          return type(self).__name__
  
imports: from functools import reduce
  import numpy
  import param
  from .dimension import Dimension, Dimensioned, ViewableElement, ViewableTree
  from .layout import AdjointLayout, Composable, Layout, Layoutable
  from .ndmapping import UniformNdMapping
  from .util import dimensioned_streams, sanitize_identifier, unique_array
label_desc: Use image node_id 6 for calling the Overlay obj's underlying member method code with example usage: obj.group() and returns: self, group, type