def spawn(self, ax, target_channels):
        """
        '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
        """
        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