code: def computeNodeDepths(self, graph):
          
          nodes = graph['nodes']
          depth = 0
          while nodes:
              next_nodes = []
              for node in nodes:
                  node['depth'] = depth
                  for link in node['sourceLinks']:
                      if not any(link['target'] is node for node in next_nodes):
                          next_nodes.append(link['target'])
              nodes = next_nodes
              depth += 1
              if depth > 10000:
                  raise RecursionError('Sankey diagrams only support acyclic graphs.')
  
          nodes = graph['nodes']
          depth = 0
          while nodes:
              next_nodes = []
              for node in nodes:
                  node['height'] = depth
                  for link in node['targetLinks']:
                      if not any(link['source'] is node for node in next_nodes):
                          next_nodes.append(link['source'])
              nodes = next_nodes
              depth += 1
              if depth > 10000:
                  raise RecursionError('Sankey diagrams only support acyclic graphs.')
  
          x0, _, x1, _ = self.p.bounds
          dx = self.p.node_width
          kx = (x1 - x0 - dx) / (depth - 1)
          for node in graph['nodes']:
              d  = node['depth'] if node['sourceLinks'] else depth - 1
              node['x0'] = x0 + max([0, min([depth-1, np.floor(d)]) * kx])
              node['x1'] = node['x0'] + dx
docs: Iteratively assign the depth (x-position) for each node.
          Nodes are assigned the maximum depth of incoming neighbors plus one;
          nodes with no incoming links are assigned depth zero, while
          nodes with no outgoing links are assigned the maximum depth.