code: def generate_flow_diagram(app):
      out_dir = op.join(app.builder.outdir, "_static")
      if not op.isdir(out_dir):
          os.makedirs(out_dir)
      out_fname = op.join(out_dir, "mne-python_flow.svg")
      make_flow_diagram = app is None or bool(
          app.builder.config.make_flow_diagram
      )
      if not make_flow_diagram:
          print(
              "Skipping flow diagram, webpage will have a missing image"
          )
          return
  
      import pygraphviz as pgv
  
      g = pgv.AGraph(name=title, directed=True)
  
      for key, label in nodes.items():
          label = label.split("\n")
          if len(label) > 1:
              label[0] = (
                  '<<FONT POINT-SIZE="%s">' % node_size
                  + label[0]
                  + "</FONT>"
              )
              for li in range(1, len(label)):
                  label[li] = (
                      '<FONT POINT-SIZE="%s"><I>' % node_small_size
                      + label[li]
                      + "</I></FONT>"
                  )
              label[-1] = label[-1] + ">"
              label = "<BR/>".join(label)
          else:
              label = label[0]
          g.add_node(key, shape="plaintext", label=label)
  
      # Create and customize nodes and edges
      for edge in edges:
          g.add_edge(*edge[:2])
          e = g.get_edge(*edge[:2])
          if len(edge) > 2:
              e.attr["label"] = (
                  "<<I>"
                  + '<BR ALIGN="LEFT"/>'.join(edge[2].split("\n"))
                  + '<BR ALIGN="LEFT"/></I>>'
              )
          e.attr["fontsize"] = edge_size
  
      # Change colors
      for these_nodes, color in zip(
          (sensor_space, source_space), (sensor_color, source_color)
      ):
          for node in these_nodes:
              g.get_node(node).attr["fillcolor"] = color
              g.get_node(node).attr["style"] = "filled"
  
      # Create subgraphs
      for si, subgraph in enumerate(subgraphs):
          g.add_subgraph(
              subgraph[0],
              "cluster%s" % si,
              label=subgraph[1],
              color="black",
          )
  
      # Format (sub)graphs
      for gr in g.subgraphs() + [g]:
          for x in [gr.node_attr, gr.edge_attr]:
              x["fontname"] = font_face
      g.node_attr["shape"] = "box"
  
      # A couple of special ones
      for ni, node in enumerate(("fwd", "inv", "trans")):
          node = g.get_node(node)
          node.attr["gradientangle"] = 270
          colors = (source_color, sensor_color)
          colors = colors if ni == 0 else colors[::-1]
          node.attr["fillcolor"] = ":".join(colors)
          node.attr["style"] = "filled"
      del node
      g.get_node("legend").attr.update(
          shape="plaintext", margin=0, rank="sink"
      )
      # put legend in same rank/level as inverse
      leg = g.add_subgraph(["legend", "inv"], name="legendy")
      leg.graph_attr["rank"] = "same"
  
      g.layout("dot")
      g.draw(out_fname, format="svg")
      return g
  
imports: import os
  from os import path
label_desc: Use image node_id 3 for calling a global function with example usage: generate_flow_diagram(app) and returns: g