code: def spawn(self, ax, target_channels):
          
          source_channels = set(self.coordinates.keys())
          is_spawnable = _check_spawnable(source_channels, target_channels)
  
          if not is_spawnable:
              return None
  
          if len(target_channels) == 1:
              verts = self.coordinates.get(target_channels[0], None), None
          else:
              verts = tuple([self.coordinates.get(ch, None) for ch in target_channels])
  
          def _callback(event):
              if event.type == Event.CHANGE:
                  svertex = event.info['caller']
                  ch = svertex.channels
                  coordinates = svertex.coordinates
                  new_coordinates = {k: v for k, v in zip(ch, coordinates)}
                  self.update_coordinates(new_coordinates)
              elif event.type == Event.VERTEX_REMOVED:
                  svertex = event.info['caller']
                  self.spawn_list.remove(svertex)
              else:
                  raise ValueError('Unrecognized event {}'.format(event))
  
          spawned_vertex = SpawnableVertex(verts, ax, _callback)
          spawned_vertex.channels = target_channels
  
          if self.spawn_list is None:
              self.spawn_list = []
          self.spawn_list.append(spawned_vertex)
          return spawned_vertex
docs: 'd1' can be shown on ('d1', 'd2') or ('d1')
          'd1', 'd2' can be shown only on ('d1', 'd2') or on ('d2', 'd1')
  
          Parameters
          --------------
          This means that the channels on which the vertex
          is defined has to be a subset of the channels
  
          channels : names of channels on which to spawn
              the vertex
  
          Returns
          -------------
          spawnedvertex if successful otherwise None