class_docstr: An AdjointLayout provides a convenient container to lay out some
  marginal plots next to a primary plot. This is often useful to
  display the marginal distributions of a plot next to the primary
  plot. AdjointLayout accepts a list of up to three elements, which
  are laid out as follows with the names 'main', 'top' and 'right':
  
   _______________
  |     3     |   |
  |___________|___|
  |           |   |  1:  main
  |           |   |  2:  right
  |     1     | 2 |  3:  top
  |           |   |
  |___________|___|
class_docstr_tok: ["An","AdjointLayout","provides","a","convenient","container","to","lay","out","some","marginal","plots","next","to","a","primary","plot",".","This","is","often","useful","to","display","the","marginal","distributions","of","a","plot","next","to","the","primary","plot",".","AdjointLayout","accepts","a","list","of","up","to","three","elements",",","which","are","laid","out","as","follows","with","the","names","'main","'",",","'top","'","and","'right","'",":","_______________","|","3","|","|","|___________|___|","|","|","|","1",":","main","|","|","|","2",":","right","|","1","|","2","|","3",":","top","|","|","|","|___________|___|"]
code: def __mul__(self, other, reverse=False):
      layer1 = other if reverse else self
      layer2 = self if reverse else other
      adjoined_items = []
      if isinstance(layer1, AdjointLayout) and isinstance(
          layer2, AdjointLayout
      ):
          adjoined_items = []
          adjoined_items.append(layer1.main * layer2.main)
          if layer1.right is not None and layer2.right is not None:
              if layer1.right.dimensions() == layer2.right.dimensions():
                  adjoined_items.append(layer1.right * layer2.right)
              else:
                  adjoined_items += [layer1.right, layer2.right]
          elif layer1.right is not None:
              adjoined_items.append(layer1.right)
          elif layer2.right is not None:
              adjoined_items.append(layer2.right)
  
          if layer1.top is not None and layer2.top is not None:
              if layer1.top.dimensions() == layer2.top.dimensions():
                  adjoined_items.append(layer1.top * layer2.top)
              else:
                  adjoined_items += [layer1.top, layer2.top]
          elif layer1.top is not None:
              adjoined_items.append(layer1.top)
          elif layer2.top is not None:
              adjoined_items.append(layer2.top)
          if len(adjoined_items) > 3:
              raise ValueError(
                  "AdjointLayouts could not be overlaid, "
                  "the dimensions of the adjoined plots "
                  "do not match and the AdjointLayout can "
                  "hold no more than two adjoined plots."
              )
      elif isinstance(layer1, AdjointLayout):
          adjoined_items = [
              layer1.data[o]
              for o in self.layout_order
              if o in layer1.data
          ]
          adjoined_items[0] = layer1.main * layer2
      elif isinstance(layer2, AdjointLayout):
          adjoined_items = [
              layer2.data[o]
              for o in self.layout_order
              if o in layer2.data
          ]
          adjoined_items[0] = layer1 * layer2.main
  
      if adjoined_items:
          return self.clone(adjoined_items)
      else:
          return NotImplemented
  
imports: import numpy
  import param
  from .None import traversal
  from .dimension import Dimension, Dimensioned, ViewableElement, ViewableTree
  from .ndmapping import NdMapping, UniformNdMapping
label_desc: Use image node_id 2 for calling the AdjointLayout obj's underlying member method code with example usage: obj.__mul__(other, reverse) and returns: self, NotImplemented