{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Create System Diagrams\n",
        "\n",
        "## Making Systems Diagrams with GraphPlot.jl\n",
        "\n",
        "This tutorial shows you how to create **node-link diagrams** in Julia\n",
        "using `Graphs.jl` and `GraphPlot.jl`. These diagrams are perfect for\n",
        "system maps — think stocks connected by flows, or components linked by\n",
        "relationships. You’ll learn how to build a graph, label nodes and edges,\n",
        "apply colours, and export your diagram. We will also use `Compose.jl` to\n",
        "draw the graphs, and `Cairo.jl` and `Fontconfig.jl` to render the graphs\n",
        "as SVGs for display.\n",
        "\n",
        "### Your first graph: nodes and edges\n",
        "\n",
        "A graph is a collection of **nodes** (vertices) connected by **edges**.\n",
        "Let’s create a simple graph with four nodes connected in a chain:"
      ],
      "id": "2b634710-6363-41ac-a942-fdb8b3ac3e4c"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"100mm\" height=\"100mm\" viewBox=\"0 0 100 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-46f63009-1\">\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path d=\"M-50,-50 L50,-50 50,50 -50,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-46f63009-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-46f63009-3\">\n",
              "  <g transform=\"translate(78.1,78.1)\">\n",
              "    <path fill=\"none\" d=\"M9.88,9.88 L-9.88,-9.88 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(49.99,49.99)\">\n",
              "    <path fill=\"none\" d=\"M10.86,10.86 L-10.86,-10.86 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(21.89,21.89)\">\n",
              "    <path fill=\"none\" d=\"M9.87,9.87 L-9.87,-9.87 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-46f63009-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-46f63009-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-46f63009-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-46f63009-7\">\n",
              "  <g transform=\"translate(91.67,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.54,64.54)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.44,35.44)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(8.33,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-46f63009-8\">\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-46f63009-9\">\n",
              "  <g transform=\"translate(50,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "import Pkg\n",
        "\n",
        "using Graphs\n",
        "using GraphPlot\n",
        "using Measures\n",
        "using Compose\n",
        "import Cairo\n",
        "import Fontconfig\n",
        "\n",
        "# Create a graph with 4 nodes and 3 edges\n",
        "g = Graphs.path_graph(4)\n",
        "\n",
        "# Draw it\n",
        "gplot(g) |> SVG()"
      ],
      "id": "2"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "You should see a diagram with four circles connected by lines.\n",
        "`path_graph(4)` creates nodes 1–2–3–4 linked in sequence.\n",
        "\n",
        "> **How to view the plot**\n",
        ">\n",
        "> - **In VS Code:** Install `Cairo.jl` (`Pkg.add(\"Cairo\")`). The plot\n",
        ">   will appear in the Plot pane.\n",
        "> - **In the REPL (terminal):** Use `gplothtml(g)` to open it in your\n",
        ">   browser.\n",
        "\n",
        "### Adding node labels\n",
        "\n",
        "Without labels, you can’t tell the nodes apart. Add labels as a vector\n",
        "of strings (one per node):"
      ],
      "id": "224d8adc-22f1-441c-87a6-cc52f471e400"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"100mm\" height=\"100mm\" viewBox=\"0 0 100 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-76337ee1-1\">\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path d=\"M-50,-50 L50,-50 50,50 -50,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-76337ee1-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-76337ee1-3\">\n",
              "  <g transform=\"translate(78.22,78.22)\">\n",
              "    <path fill=\"none\" d=\"M9.77,9.77 L-9.77,-9.77 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(49.89,49.89)\">\n",
              "    <path fill=\"none\" d=\"M11.19,11.19 L-11.19,-11.19 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(21.68,21.68)\">\n",
              "    <path fill=\"none\" d=\"M9.66,9.66 L-9.66,-9.66 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-76337ee1-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-76337ee1-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-76337ee1-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-76337ee1-7\">\n",
              "  <g transform=\"translate(91.67,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.77,64.77)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.02,35.02)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(8.33,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-76337ee1-8\">\n",
              "  <g transform=\"translate(91.67,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Solar</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.77,64.77)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Battery</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.02,35.02)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Grid</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(8.33,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Load</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-76337ee1-9\">\n",
              "  <g transform=\"translate(50,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "nodelabel = [\"Solar\", \"Battery\", \"Grid\", \"Load\"]\n",
        "gplot(g, nodelabel=nodelabel) |> SVG()"
      ],
      "id": "4"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "If labels overwrite the nodes, pull them farther out:"
      ],
      "id": "90e4cbb6-df25-42f9-9547-193ca8a9dc5d"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"100mm\" height=\"100mm\" viewBox=\"0 0 100 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-889d851f-1\">\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path d=\"M-50,-50 L50,-50 50,50 -50,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-889d851f-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-889d851f-3\">\n",
              "  <g transform=\"translate(78.41,21.59)\">\n",
              "    <path fill=\"none\" d=\"M9.57,-9.57 L-9.57,9.57 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(50.14,49.86)\">\n",
              "    <path fill=\"none\" d=\"M11.33,-11.33 L-11.33,11.33 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(21.73,78.27)\">\n",
              "    <path fill=\"none\" d=\"M9.72,-9.72 L-9.72,9.72 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-889d851f-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-889d851f-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-889d851f-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-889d851f-7\">\n",
              "  <g transform=\"translate(91.67,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(65.16,34.84)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.13,64.87)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(8.33,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-889d851f-8\">\n",
              "  <g transform=\"translate(95.35,4.65)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Solar</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(68.84,31.16)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Battery</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(38.81,61.19)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Grid</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.02,87.98)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Load</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-889d851f-9\">\n",
              "  <g transform=\"translate(50,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "gplot(g, nodelabel=nodelabel, nodelabeldist=1, nodelabelangleoffset=π/4) |> SVG()"
      ],
      "id": "6"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "- `nodelabeldist` — distance from centre of node to label\n",
        "- `nodelabelangleoffset` — rotation angle; default `π/4` puts them\n",
        "  top-right\n",
        "\n",
        "### Colouring nodes\n",
        "\n",
        "Colour nodes to distinguish types (e.g., generation vs. consumption).\n",
        "Use the `nodefillc` keyword with a vector the same length as the number\n",
        "of nodes:"
      ],
      "id": "152d7122-effc-4029-b08d-d8de6da1d78e"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"100mm\" height=\"100mm\" viewBox=\"0 0 100 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-dd57b2b3-1\">\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path d=\"M-50,-50 L50,-50 50,50 -50,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-dd57b2b3-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-dd57b2b3-3\">\n",
              "  <g transform=\"translate(21.74,78.26)\">\n",
              "    <path fill=\"none\" d=\"M-9.72,9.72 L9.72,-9.72 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path fill=\"none\" d=\"M-11.17,11.17 L11.17,-11.17 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(78.26,21.74)\">\n",
              "    <path fill=\"none\" d=\"M-9.73,9.73 L9.73,-9.73 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-dd57b2b3-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-dd57b2b3-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-dd57b2b3-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" id=\"img-dd57b2b3-7\">\n",
              "  <g transform=\"translate(8.33,91.67)\" fill=\"#FFD700\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.15,64.85)\" fill=\"#4682B4\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.84,35.16)\" fill=\"#FFA500\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(91.67,8.33)\" fill=\"#FF6347\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-dd57b2b3-8\">\n",
              "  <g transform=\"translate(8.33,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Solar</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.15,64.85)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Battery</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.84,35.16)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Grid</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(91.67,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Load</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-dd57b2b3-9\">\n",
              "  <g transform=\"translate(50,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "using Colors\n",
        "\n",
        "# One colour per node\n",
        "nodefillc = [colorant\"gold\", colorant\"steelblue\",\n",
        "             colorant\"orange\", colorant\"tomato\"]\n",
        "gplot(g, nodelabel=nodelabel, nodefillc=nodefillc) |> SVG()"
      ],
      "id": "8"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Or generate a palette automatically:"
      ],
      "id": "faf32199-ab66-4b07-a52f-6fc99fe51635"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"100mm\" height=\"100mm\" viewBox=\"0 0 100 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-1ae9f7df-1\">\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path d=\"M-50,-50 L50,-50 50,50 -50,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-1ae9f7df-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-1ae9f7df-3\">\n",
              "  <g transform=\"translate(21.75,78.25)\">\n",
              "    <path fill=\"none\" d=\"M-9.73,9.73 L9.73,-9.73 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(50,50)\">\n",
              "    <path fill=\"none\" d=\"M-11.15,11.15 L11.15,-11.15 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(78.25,21.75)\">\n",
              "    <path fill=\"none\" d=\"M-9.73,9.73 L9.73,-9.73 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-1ae9f7df-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-1ae9f7df-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-1ae9f7df-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" id=\"img-1ae9f7df-7\">\n",
              "  <g transform=\"translate(8.33,91.67)\" fill=\"#0000FF\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.16,64.84)\" fill=\"#A0FF35\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.84,35.16)\" fill=\"#24390F\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(91.67,8.33)\" fill=\"#FF987F\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-1ae9f7df-8\">\n",
              "  <g transform=\"translate(8.33,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Solar</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(35.16,64.84)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Battery</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(64.84,35.16)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Grid</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(91.67,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Load</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-1ae9f7df-9\">\n",
              "  <g transform=\"translate(50,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "nodefillc = distinguishable_colors(4, colorant\"blue\")\n",
        "gplot(g, nodelabel=nodelabel, nodefillc=nodefillc) |> SVG()"
      ],
      "id": "10"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Directed graphs for stocks & flows\n",
        "\n",
        "In a stock-and-flow diagram, flows have **direction**. A directed graph\n",
        "uses arrows to show which way material (money, energy, information)\n",
        "moves. `GraphPlot.jl` draws arrowheads automatically on directed edges."
      ],
      "id": "c75f4512-ca31-4f52-a546-81ef74eb92fb"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-977de9a0-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-977de9a0-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-977de9a0-3\">\n",
              "  <g transform=\"translate(30.63,20.42)\">\n",
              "    <path fill=\"none\" d=\"M-12.61,-8.41 L12.61,8.41 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(72.85,48.56)\">\n",
              "    <path fill=\"none\" d=\"M-14.4,-9.6 L14.4,9.6 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(115.13,76.76)\">\n",
              "    <path fill=\"none\" d=\"M-12.69,-8.46 L12.69,8.46 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-977de9a0-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-977de9a0-5\">\n",
              "  <g transform=\"translate(44.63,29.75)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(88.63,59.09)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(129.21,86.14)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-977de9a0-6\">\n",
              "  <g transform=\"translate(32.71,21.81)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Photosynthesis</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(74.92,49.95)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Decomposition</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(117.21,78.14)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Runoff</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-977de9a0-7\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(52.92,35.28)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.92,64.61)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-977de9a0-8\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(52.92,35.28)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.92,64.61)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-977de9a0-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "# Create a directed graph: 4 nodes, edges from 1→2, 2→3, 3→4\n",
        "g = Graphs.path_digraph(4)\n",
        "\n",
        "stock_labels = [\"Atmosphere\", \"Plants\", \"Soil\", \"Ocean\"]\n",
        "flow_labels  = [\"Photosynthesis\", \"Decomposition\", \"Runoff\"]\n",
        "\n",
        "gplot(g, nodelabel=stock_labels, edgelabel=flow_labels) |> SVG(15cm, 10cm)"
      ],
      "id": "12"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "> **Note**\n",
        ">\n",
        "> Use `SimpleDiGraph` (directed) for flows with arrows. Use\n",
        "> `SimpleGraph` (undirected) for mutual relationships. See the\n",
        "> [Graphs.jl docs](https://juliagraphs.org/Graphs.jl/stable/) for the\n",
        "> full API.\n",
        "\n",
        "### Edge labels and line styling\n",
        "\n",
        "Label your edges to show what each flow represents:"
      ],
      "id": "9032c51f-c893-4f91-8add-ac3cf6a84f2f"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-95896707-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-95896707-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-95896707-3\">\n",
              "  <g transform=\"translate(30.77,20.51)\">\n",
              "    <path fill=\"none\" d=\"M-12.74,-8.49 L12.74,8.49 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(72.92,48.62)\">\n",
              "    <path fill=\"none\" d=\"M-14.22,-9.48 L14.22,9.48 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(115.08,76.72)\">\n",
              "    <path fill=\"none\" d=\"M-12.74,-8.49 L12.74,8.49 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-95896707-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-95896707-5\">\n",
              "  <g transform=\"translate(44.89,29.93)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(88.52,59.02)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(129.21,86.14)\">\n",
              "    <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-95896707-6\">\n",
              "  <g transform=\"translate(32.84,21.89)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Photosynthesis</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Decomposition</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(117.16,78.11)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Runoff</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-95896707-7\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.18,35.46)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.82,64.54)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-95896707-8\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.18,35.46)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.82,64.54)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-95896707-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "edgelabel = [\"Photosynthesis\", \"Decomposition\", \"Runoff\"]\n",
        "gplot(g, nodelabel=stock_labels, edgelabel=edgelabel) |> SVG(15cm, 10cm)"
      ],
      "id": "14"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Adjust edge label placement with `edgelabeldistx` and `edgelabeldisty`:"
      ],
      "id": "206a835a-a9c7-4b13-923c-d86d38e6db8f"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-269b0163-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-269b0163-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-269b0163-3\">\n",
              "  <g transform=\"translate(119.47,79.65)\">\n",
              "    <path fill=\"none\" d=\"M12.5,8.34 L-12.5,-8.34 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(77.08,51.39)\">\n",
              "    <path fill=\"none\" d=\"M14.69,9.79 L-14.69,-9.79 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(34.68,23.12)\">\n",
              "    <path fill=\"none\" d=\"M12.51,8.34 L-12.51,-8.34 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-269b0163-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-269b0163-5\">\n",
              "  <g transform=\"translate(105.58,70.39)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(61.01,40.67)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(20.79,13.86)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-269b0163-6\">\n",
              "  <g transform=\"translate(121.3,80.87)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Photosynthesis</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(78.91,52.61)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Decomposition</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(36.51,24.34)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Runoff</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-269b0163-7\">\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(97.29,64.86)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(52.71,35.14)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-269b0163-8\">\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(97.29,64.86)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(52.71,35.14)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-269b0163-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "gplot(g, nodelabel=stock_labels, edgelabel=edgelabel,\n",
        "      edgelabeldistx=0.5, edgelabeldisty=0.5) |> SVG(15cm, 10cm)"
      ],
      "id": "16"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "To colour specific edges differently, use `edgestrokec`:"
      ],
      "id": "50d63ea0-59b8-4c6b-8e09-fea2ccb21550"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-aedf662f-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" id=\"img-aedf662f-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" id=\"img-aedf662f-3\">\n",
              "  <g transform=\"translate(30.77,20.51)\" stroke=\"#008000\">\n",
              "    <path fill=\"none\" d=\"M-12.75,-8.5 L12.75,8.5 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(72.93,48.62)\" stroke=\"#A52A2A\">\n",
              "    <path fill=\"none\" d=\"M-14.22,-9.48 L14.22,9.48 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(115.09,76.72)\" stroke=\"#0000FF\">\n",
              "    <path fill=\"none\" d=\"M-12.74,-8.49 L12.74,8.49 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g transform=\"translate(44.9,29.93)\" fill=\"#008000\">\n",
              "  <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "</g>\n",
              "<g transform=\"translate(88.53,59.02)\" fill=\"#A52A2A\">\n",
              "  <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "</g>\n",
              "<g transform=\"translate(129.21,86.14)\" fill=\"#0000FF\">\n",
              "  <path d=\"M0.13,-1.93 L2.77,1.85 -2.9,0.08  z\" class=\"primitive\"/>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-aedf662f-4\">\n",
              "  <g transform=\"translate(32.85,21.9)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Photosynthesis</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75.01,50.01)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Decomposition</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(117.16,78.11)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Runoff</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-aedf662f-5\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.19,35.46)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.83,64.55)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-aedf662f-6\">\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.19,35.46)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.83,64.55)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-aedf662f-7\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "edge_colours = [colorant\"green\", colorant\"brown\", colorant\"blue\"]\n",
        "gplot(g, nodelabel=stock_labels, edgelabel=edgelabel,\n",
        "      edgestrokec=edge_colours) |> SVG(15cm, 10cm)"
      ],
      "id": "18"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Choosing a layout\n",
        "\n",
        "Different layouts reveal different structure. Try these on your graph:"
      ],
      "id": "d5fa0895-d4f3-4e25-82e4-19341a8bf685"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-ef75e1f5-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-ef75e1f5-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-ef75e1f5-3\">\n",
              "  <g transform=\"translate(119.24,79.49)\">\n",
              "    <path fill=\"none\" d=\"M12.74,8.49 L-12.74,-8.49 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(77.08,51.39)\">\n",
              "    <path fill=\"none\" d=\"M14.22,9.48 L-14.22,-9.48 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(34.92,23.28)\">\n",
              "    <path fill=\"none\" d=\"M12.74,8.49 L-12.74,-8.49 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-ef75e1f5-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-ef75e1f5-5\">\n",
              "  <g transform=\"translate(105.12,70.08)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(61.48,40.99)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(20.79,13.86)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-ef75e1f5-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-ef75e1f5-7\">\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.83,64.55)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.18,35.46)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-ef75e1f5-8\">\n",
              "  <g transform=\"translate(137.5,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(96.83,64.55)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(53.18,35.46)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-ef75e1f5-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "# Force-directed (default, good for most cases)\n",
        "gplot(g, layout=spring_layout, nodelabel=stock_labels) |> SVG(15cm, 10cm)"
      ],
      "id": "20"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-16caeefa-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-16caeefa-2\">\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-16caeefa-3\">\n",
              "  <g transform=\"translate(108.33,69.45)\">\n",
              "    <path fill=\"none\" d=\"M23.65,-15.77 L-23.65,15.77 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(45.83,72.22)\">\n",
              "    <path fill=\"none\" d=\"M23.65,15.77 L-23.65,-15.77 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(41.67,30.55)\">\n",
              "    <path fill=\"none\" d=\"M-23.65,15.77 L23.65,-15.77 \" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-16caeefa-4\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-16caeefa-5\">\n",
              "  <g transform=\"translate(83.29,86.14)\">\n",
              "    <path d=\"M2.9,0.08 L-2.77,1.85 -0.13,-1.93  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(20.79,55.53)\">\n",
              "    <path d=\"M-0.13,1.93 L-2.77,-1.85 2.9,-0.08  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(66.71,13.86)\">\n",
              "    <path d=\"M-2.9,-0.08 L2.77,-1.85 0.13,1.93  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-16caeefa-6\">\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" fill=\"#40E0D0\" id=\"img-16caeefa-7\">\n",
              "  <g transform=\"translate(137.5,50)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,91.67)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,50)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,8.33)\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-16caeefa-8\">\n",
              "  <g transform=\"translate(137.5,50)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,50)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-16caeefa-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "# Circular --- good for closed loops like nutrient cycles\n",
        "gplot(g, layout=circular_layout, nodelabel=stock_labels) |> SVG(15cm, 10cm)"
      ],
      "id": "22"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Saving your diagram\n",
        "\n",
        "Use `Compose.jl` with `Cairo.jl` and `Fontconfig.jl` to export your\n",
        "diagram as PNG, PDF, or SVG:"
      ],
      "id": "ba6721f5-5b7d-465a-b597-e1ee30e5dbd4"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "execute": false
      },
      "outputs": [],
      "source": [
        "using Compose\n",
        "import Cairo\n",
        "import Fontconfig\n",
        "\n",
        "# Create the plot\n",
        "p = gplot(g, nodelabel=stock_labels, nodefillc=nodefillc)\n",
        "\n",
        "# Save as PNG\n",
        "p |> PNG(\"stock-flow.png\", 16cm, 16cm)\n",
        "\n",
        "# Save as PDF (vector format, scales to any size)\n",
        "p |> PDF(\"stock-flow.pdf\", 16cm, 16cm)\n",
        "\n",
        "# Save as SVG\n",
        "p |> SVG(\"stock-flow.svg\", 16cm, 16cm)"
      ],
      "id": "24"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Complete example: carbon cycle diagram\n",
        "\n",
        "Here is a full script you can copy and run, using `SimpleDiGraph`\n",
        "instead of `path_digraph` as above. It builds a simple carbon-cycle\n",
        "model with four stocks (atmosphere, plants, soil, ocean) and five flows."
      ],
      "id": "ca7f58fd-dc34-4020-919e-6cc6ef5127ef"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {},
      "outputs": [
        {
          "output_type": "display_data",
          "metadata": {},
          "data": {
            "text/html": [
              "<html>\n",
              "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\"\n",
              "     xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n",
              "     version=\"1.2\"\n",
              "     width=\"150mm\" height=\"100mm\" viewBox=\"0 0 150 100\"\n",
              "     stroke=\"none\"\n",
              "     fill=\"#000000\"\n",
              "     stroke-width=\"0.3\"\n",
              "     font-size=\"3.88\"\n",
              ">\n",
              "<defs>\n",
              "  <marker id=\"arrow\" markerWidth=\"15\" markerHeight=\"7\" refX=\"5\" refY=\"3.5\" orient=\"auto\" markerUnits=\"strokeWidth\">\n",
              "    <path d=\"M0,0 L15,3.5 L0,7 z\" stroke=\"context-stroke\" fill=\"context-stroke\"/>\n",
              "  </marker>\n",
              "</defs>\n",
              "<g fill=\"#000000\" fill-opacity=\"0.000\" id=\"img-65004779-1\">\n",
              "  <g transform=\"translate(75,50)\">\n",
              "    <path d=\"M-75,-50 L75,-50 75,50 -75,50  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-65004779-2\">\n",
              "  <g transform=\"translate(95.59,61.49)\">\n",
              "    <path fill=\"none\" d=\"M34.19,-10.67 C-3.22,-6.72 -12.53,-3.77 -18.45,21.17\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(120.27,22.06)\">\n",
              "    <path fill=\"none\" d=\"M16.01,22.79 C10.08,-2.14 5.66,-8.35 -31.75,-12.3\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(57.77,63.73)\">\n",
              "    <path fill=\"none\" d=\"M16.01,22.79 C10.08,-2.14 5.66,-8.35 -31.75,-12.3\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(72.62,65.22)\">\n",
              "    <path fill=\"none\" d=\"M-53.8,-12.16 C-8.35,9.86 8.35,12.16 53.8,-9.86\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(92.23,36.27)\">\n",
              "    <path fill=\"none\" d=\"M-16.01,-22.79 C-10.08,2.14 -5.66,8.35 31.75,12.3\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"1.5\" stroke=\"#D3D3D3\" id=\"img-65004779-3\">\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-65004779-4\">\n",
              "  <g transform=\"translate(76.83,83.94)\">\n",
              "    <path d=\"M2.42,-1.07 L-0.61,2.58 -1.81,-1.51  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(86.58,9.56)\">\n",
              "    <path d=\"M1.6,1.61 L-3.87,-0.41 2.27,-1.2  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(24.08,51.22)\">\n",
              "    <path d=\"M1.6,1.61 L-3.87,-0.41 2.27,-1.2  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(128.01,54.6)\">\n",
              "    <path d=\"M-2.84,-0.39 L3.17,-1.53 -0.33,1.92  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(125.92,48.78)\">\n",
              "    <path d=\"M-1.6,-1.61 L3.87,0.41 -2.27,1.2  z\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g fill=\"#D3D3D3\" id=\"img-65004779-5\">\n",
              "</g>\n",
              "<g font-size=\"4\" fill=\"#000000\" id=\"img-65004779-6\">\n",
              "  <g transform=\"translate(91.66,58.86)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Photosynthesis</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(124.2,19.44)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean uptake</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(61.7,61.1)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Litter fall</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(72.62,70.72)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Respiration</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(88.3,38.9)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean release</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g stroke-width=\"0\" stroke=\"#000000\" stroke-opacity=\"0.000\" id=\"img-65004779-7\">\n",
              "  <g transform=\"translate(137.5,50)\" fill=\"#ADD8E6\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,91.67)\" fill=\"#008000\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,50)\" fill=\"#EE9A49\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,8.33)\" fill=\"#00BFFF\">\n",
              "    <circle cx=\"0\" cy=\"0\" r=\"7.5\" class=\"primitive\"/>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-65004779-8\">\n",
              "  <g transform=\"translate(137.5,50)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Atmosphere</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,91.67)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Plants</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(12.5,50)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Soil</text>\n",
              "    </g>\n",
              "  </g>\n",
              "  <g transform=\"translate(75,8.33)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\">Ocean</text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "<g font-family=\"Helvetica\" font-size=\"4\" fill=\"#000000\" id=\"img-65004779-9\">\n",
              "  <g transform=\"translate(75,0)\">\n",
              "    <g class=\"primitive\">\n",
              "      <text text-anchor=\"middle\" dy=\"0.35em\"></text>\n",
              "    </g>\n",
              "  </g>\n",
              "</g>\n",
              "</svg>\n",
              "\n",
              "</html>"
            ]
          }
        }
      ],
      "source": [
        "using Graphs\n",
        "using GraphPlot\n",
        "using Colors\n",
        "using Compose\n",
        "import Cairo\n",
        "import Fontconfig\n",
        "\n",
        "# --- Build the directed graph ---\n",
        "# Nodes: 1=Atmosphere, 2=Plants, 3=Soil, 4=Ocean\n",
        "# Edges (flows):\n",
        "#   1→2  photosynthesis\n",
        "#   2→3  litter fall\n",
        "#   3→1  decomopsi\n",
        "#   1→4  ocean uptake\n",
        "#   4→1  ocean release\n",
        "\n",
        "g = SimpleDiGraph(4) # argument is number of nodes\n",
        "add_edge!(g, 1, 2)   # atmosphere → plants\n",
        "add_edge!(g, 1, 4)   # atmosphere → ocean\n",
        "add_edge!(g, 2, 3)   # plants → soil\n",
        "add_edge!(g, 3, 1)   # soil → atmosphere\n",
        "add_edge!(g, 4, 1)   # ocean → atmosphere\n",
        "\n",
        "# --- Labels ---\n",
        "nodelabel = [\"Atmosphere\", \"Plants\", \"Soil\", \"Ocean\"]\n",
        "edgelabel = [\"Photosynthesis\", \"Ocean uptake\", \"Litter fall\", \n",
        "             \"Respiration\", \"Ocean release\"]\n",
        "\n",
        "# --- Colours ---\n",
        "nodefillc = [colorant\"lightblue\", colorant\"green\",\n",
        "             colorant\"tan2\", colorant\"deepskyblue\"]\n",
        "\n",
        "# --- Draw ---\n",
        "p = gplot(g,\n",
        "    nodelabel      = nodelabel,\n",
        "    nodefillc      = nodefillc,\n",
        "    edgelabel      = edgelabel,\n",
        "    layout         = circular_layout, \n",
        "    linetype       = \"curve\",\n",
        "    plot_size      = (15cm, 10cm)\n",
        ")\n",
        "\n",
        "# --- Save ---\n",
        "p |> SVG(15cm, 10cm)"
      ],
      "id": "26"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Node shapes and other customisation\n",
        "\n",
        "> **Warning**\n",
        ">\n",
        "> GraphPlot.jl only draws **circular nodes**. If you need rectangles,\n",
        "> diamonds, or custom shapes for stock-and-flow diagrams (e.g.,\n",
        "> rectangles for stocks, valves for flows), you will need a different\n",
        "> package:\n",
        ">\n",
        "> - **GraphRecipes.jl** (with Plots.jl) — supports `markershape` for\n",
        ">   different node shapes.\n",
        "> - **GraphMakie.jl** — the most flexible; supports custom node markers,\n",
        ">   interactive plots, and 3D.\n",
        ">\n",
        "> You can install these packages the same way as the others\n",
        "> (`Pkg.add(\"GraphRecipes\")` or `Pkg.add(\"GraphMakie\")`).\n",
        "\n",
        "### Troubleshooting\n",
        "\n",
        "| Symptom | Fix |\n",
        "|----------------------------|--------------------------------------------|\n",
        "| `Package GraphPlot not found` | Run `Pkg.add(\"GraphPlot\")` in the REPL. |\n",
        "| Plot doesn’t appear in VS Code | Run `Pkg.add(\"Cairo\")`, then restart Julia. |\n",
        "| Labels overlap nodes | Increase `nodelabeldist` (e.g., `2.0`). |\n",
        "| “No display backend” error | Install Cairo (`Pkg.add(\"Cairo\")`) and try `using Cairo` first. |\n",
        "| All nodes same colour | `nodefillc` must be a vector with length equal to the number of nodes. |\n",
        "\n",
        "### Next steps\n",
        "\n",
        "- Experiment with `shell_layout` to group nodes in concentric rings.\n",
        "- Use `nodesize` to make important stocks larger relative to others.\n",
        "- Explore the [GraphPlot.jl\n",
        "  README](https://github.com/JuliaGraphs/GraphPlot.jl) for the full list\n",
        "  of keyword arguments."
      ],
      "id": "ead48688-b781-43fb-bbe7-11348f0a1abc"
    }
  ],
  "nbformat": 4,
  "nbformat_minor": 5,
  "metadata": {
    "kernel_info": {
      "name": "julia"
    },
    "kernelspec": {
      "name": "julia",
      "display_name": "Julia",
      "language": "julia"
    },
    "language_info": {
      "name": "julia",
      "codemirror_mode": "julia",
      "version": "1.11.5"
    }
  }
}