{ "cells": [ { "cell_type": "markdown", "id": "ed13a6b8-1d5b-4ce0-9cd4-b81bac7b07dd", "metadata": {}, "source": [ "## Plotting" ] }, { "cell_type": "code", "execution_count": 1, "id": "b0f61785-6be5-4a0f-8282-5c17f4cc28ad", "metadata": {}, "outputs": [], "source": [ "from optiwindnet.importer import load_repository\n", "from optiwindnet.interarraylib import G_from_S\n", "from optiwindnet.mesh import make_planar_embedding\n", "from optiwindnet.pathfinding import PathFinder\n", "from optiwindnet.heuristics import EW_presolver" ] }, { "cell_type": "markdown", "id": "3f8789d4-5f85-4e50-a7b6-dd9b57f0e4a2", "metadata": {}, "source": [ "### Create a sample network" ] }, { "cell_type": "code", "execution_count": 2, "id": "2ce45605-8d5f-46ca-bcb3-1c758b8c70d0", "metadata": {}, "outputs": [], "source": [ "locations = load_repository()\n", "L = locations.london\n", "P, A = make_planar_embedding(L)\n", "S = EW_presolver(A, capacity=7)\n", "Gʹ = G_from_S(S, A)\n", "G = PathFinder(Gʹ, planar=P, A=A).create_detours()" ] }, { "cell_type": "markdown", "id": "0d4a4c35-4ba9-475b-bd4e-62e909459b12", "metadata": {}, "source": [ "### Using Matplotlib-based `gplot()`" ] }, { "cell_type": "markdown", "id": "40569656-a562-46cf-a4a1-c5f78cec0317", "metadata": {}, "source": [ "Matplotlib can produce inline plots in Jupyter notebooks using different formats. The default is PNG and it works ok, but the embedding of the binary image in the text-only `.ipynb` file makes them big and generates many false-positives when searching for short strings (outside of Jupyter, e.g. `ripgrep`).\n", "\n", "By using the SVG format, the notebooks are smaller in size and the false-positives are avoided. In addition, the vector-based figures saved within the notebook can be exported as editable SVG files without needing to run the notebook again. On JupyterLab:\n", "- Shift+Right_click -> \"Open image in new tab\"\n", "- Menu \"File\" -> \"Save\"\n", "\n", "The 'svg.fonttype' rcParams entry set to 'none' prevents Matplotlib from converting text to paths, which also helps with reducing image sizes (the drawback being possible visual differences if the fonts used at creation are not available when visualizing the figures).\n", "\n", "One drawback of SVG plots in Jupyter notebooks is having to mark the notebook as **Trusted** to display the figures when opening it on a different computer than the one that created it. In JupyterLab , search for 'trust' and select \"Trust Notebook\"." ] }, { "cell_type": "code", "execution_count": 3, "id": "ed8cad93-9ea1-4fb5-ac52-f009377dacca", "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%config InlineBackend.figure_formats = ['svg']\n", "plt.rcParams['svg.fonttype'] = 'none'" ] }, { "cell_type": "markdown", "id": "b2829ede-58ba-4ec5-b0a6-633c246be220", "metadata": {}, "source": [ "The Matplotlib-based plotting functions in OptiWindNet are `gplot()` and `pplot()`." ] }, { "cell_type": "code", "execution_count": 4, "id": "65597b47-7a71-4688-9977-a9d22371282c", "metadata": {}, "outputs": [], "source": [ "from optiwindnet.plotting import pplot, gplot" ] }, { "cell_type": "code", "execution_count": 5, "id": "f44ded78-d584-4685-9032-1ac2c1180629", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:27.943599\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " κ = 7, T = 175\n", " (+4) SS-2: 15, SS-1: 14\n", " Σλ = 175 293 m\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = gplot(G)" ] }, { "cell_type": "markdown", "id": "beb9c5ea-b8c4-432f-878c-de26fc7373aa", "metadata": {}, "source": [ "If G is assigned cable types, it is encoded in the thickness of the edges (higher capacities represented by thicker lines). The total network cost is also added to the infobox." ] }, { "cell_type": "code", "execution_count": 6, "id": "b580c733-ff3f-4372-8bff-844f30660760", "metadata": {}, "outputs": [], "source": [ "from optiwindnet.interarraylib import assign_cables" ] }, { "cell_type": "code", "execution_count": 7, "id": "122b0541-d364-4fec-ac80-3bf51cb78f79", "metadata": {}, "outputs": [], "source": [ "# one 2-tuple for each cable type: (capacity, linear cost)\n", "# capacities must be increasing\n", "assign_cables(G, cables=[(2, 400), (4, 600), (7, 900)])" ] }, { "cell_type": "code", "execution_count": 8, "id": "d0741cde-1b4a-4f8b-a799-ce82442e4eef", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:28.066890\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " κ = 7, T = 175\n", " (+4) SS-2: 15, SS-1: 14\n", " Σλ = 175 293 m\n", " 122 555 217 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = gplot(G)" ] }, { "cell_type": "markdown", "id": "24306491-58dd-41c6-9c7f-588ca90b0ece", "metadata": {}, "source": [ "`gplot()` returns a plt.Axes object, which can be used to adjust many aspects of the figure, or to save it to a file in a variety of formats, e.g.:\n", "```python\n", "ax.figure.savefig('myfig.pdf')\n", "```" ] }, { "cell_type": "markdown", "id": "9cc236bf-61b1-43b7-90d0-a866e32eb1f2", "metadata": {}, "source": [ "It is also possible to provide a pre-existing plt.Axes object within a matplotlib figure:" ] }, { "cell_type": "code", "execution_count": 9, "id": "0cb5f83f-71ca-4bd3-a5ea-9145b5c0473b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:28.193247\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, (ax1, ax2) = plt.subplots(1, 2, facecolor='none', figsize=(9, 3))\n", "pplot(P, A, ax=ax1)\n", "gplot(A, ax=ax2)" ] }, { "cell_type": "markdown", "id": "7f83a63e-f40d-49d6-9c67-86f72535e604", "metadata": {}, "source": [ "`pplot(P, A)` is only useful for tinkering with the pathfinding algorithm and most OptiWindNet users will not need to use it. Plotting the available edges graph **A** is useful mainly for debugging." ] }, { "cell_type": "markdown", "id": "a41f283c-8d65-4f29-a5e7-2ef05f0ecbf3", "metadata": {}, "source": [ "The main advantages of `gplot()` over `svgplot()` are node tags and figure legends:" ] }, { "cell_type": "code", "execution_count": 10, "id": "af77797c-63a6-4cc9-a6f8-113ec6c140e6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:28.891217\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " SS-1\n", " \n", " \n", " SS-2\n", " \n", " \n", " A10\n", " \n", " \n", " A11\n", " \n", " \n", " A12\n", " \n", " \n", " A13\n", " \n", " \n", " A14\n", " \n", " \n", " A15\n", " \n", " \n", " B08\n", " \n", " \n", " B09\n", " \n", " \n", " B10\n", " \n", " \n", " B11\n", " \n", " \n", " B12\n", " \n", " \n", " B13\n", " \n", " \n", " B15\n", " \n", " \n", " B16\n", " \n", " \n", " B17\n", " \n", " \n", " C06\n", " \n", " \n", " C07\n", " \n", " \n", " C08\n", " \n", " \n", " C09\n", " \n", " \n", " C10\n", " \n", " \n", " C11\n", " \n", " \n", " C12\n", " \n", " \n", " C13\n", " \n", " \n", " C14\n", " \n", " \n", " C15\n", " \n", " \n", " C17\n", " \n", " \n", " C18\n", " \n", " \n", " C19\n", " \n", " \n", " D04\n", " \n", " \n", " D05\n", " \n", " \n", " D06\n", " \n", " \n", " D07\n", " \n", " \n", " D08\n", " \n", " \n", " D09\n", " \n", " \n", " D10\n", " \n", " \n", " D11\n", " \n", " \n", " D12\n", " \n", " \n", " D13\n", " \n", " \n", " D14\n", " \n", " \n", " D15\n", " \n", " \n", " D16\n", " \n", " \n", " D17\n", " \n", " \n", " D19\n", " \n", " \n", " D20\n", " \n", " \n", " E02\n", " \n", " \n", " E03\n", " \n", " \n", " E04\n", " \n", " \n", " E05\n", " \n", " \n", " E06\n", " \n", " \n", " E07\n", " \n", " \n", " E08\n", " \n", " \n", " E09\n", " \n", " \n", " E10\n", " \n", " \n", " E11\n", " \n", " \n", " E12\n", " \n", " \n", " E13\n", " \n", " \n", " E14\n", " \n", " \n", " E15\n", " \n", " \n", " E16\n", " \n", " \n", " E17\n", " \n", " \n", " E18\n", " \n", " \n", " E19\n", " \n", " \n", " F01\n", " \n", " \n", " F02\n", " \n", " \n", " F03\n", " \n", " \n", " F04\n", " \n", " \n", " F05\n", " \n", " \n", " F06\n", " \n", " \n", " F07\n", " \n", " \n", " F08\n", " \n", " \n", " F09\n", " \n", " \n", " F10\n", " \n", " \n", " F11\n", " \n", " \n", " F12\n", " \n", " \n", " F13\n", " \n", " \n", " F14\n", " \n", " \n", " F15\n", " \n", " \n", " F16\n", " \n", " \n", " F17\n", " \n", " \n", " F18\n", " \n", " \n", " F19\n", " \n", " \n", " F20\n", " \n", " \n", " G03\n", " \n", " \n", " G04\n", " \n", " \n", " G05\n", " \n", " \n", " G06\n", " \n", " \n", " G07\n", " \n", " \n", " G08\n", " \n", " \n", " G09\n", " \n", " \n", " G10\n", " \n", " \n", " G11\n", " \n", " \n", " G12\n", " \n", " \n", " G13\n", " \n", " \n", " G14\n", " \n", " \n", " G15\n", " \n", " \n", " G16\n", " \n", " \n", " G17\n", " \n", " \n", " G18\n", " \n", " \n", " G19\n", " \n", " \n", " G20\n", " \n", " \n", " H04\n", " \n", " \n", " H05\n", " \n", " \n", " H06\n", " \n", " \n", " H07\n", " \n", " \n", " H08\n", " \n", " \n", " H09\n", " \n", " \n", " H10\n", " \n", " \n", " H11\n", " \n", " \n", " H12\n", " \n", " \n", " H13\n", " \n", " \n", " H14\n", " \n", " \n", " H15\n", " \n", " \n", " H16\n", " \n", " \n", " H17\n", " \n", " \n", " H18\n", " \n", " \n", " H19\n", " \n", " \n", " H20\n", " \n", " \n", " I05\n", " \n", " \n", " I06\n", " \n", " \n", " I07\n", " \n", " \n", " I08\n", " \n", " \n", " I09\n", " \n", " \n", " I10\n", " \n", " \n", " I11\n", " \n", " \n", " I12\n", " \n", " \n", " I13\n", " \n", " \n", " I14\n", " \n", " \n", " I15\n", " \n", " \n", " I16\n", " \n", " \n", " I17\n", " \n", " \n", " I18\n", " \n", " \n", " I19\n", " \n", " \n", " I20\n", " \n", " \n", " J06\n", " \n", " \n", " J07\n", " \n", " \n", " J08\n", " \n", " \n", " J09\n", " \n", " \n", " J10\n", " \n", " \n", " J11\n", " \n", " \n", " J12\n", " \n", " \n", " J13\n", " \n", " \n", " J14\n", " \n", " \n", " J15\n", " \n", " \n", " J16\n", " \n", " \n", " J17\n", " \n", " \n", " J18\n", " \n", " \n", " J19\n", " \n", " \n", " J20\n", " \n", " \n", " K11\n", " \n", " \n", " K12\n", " \n", " \n", " K13\n", " \n", " \n", " K14\n", " \n", " \n", " K15\n", " \n", " \n", " K16\n", " \n", " \n", " K17\n", " \n", " \n", " K18\n", " \n", " \n", " K19\n", " \n", " \n", " K20\n", " \n", " \n", " L11\n", " \n", " \n", " L12\n", " \n", " \n", " L13\n", " \n", " \n", " L14\n", " \n", " \n", " L15\n", " \n", " \n", " L16\n", " \n", " \n", " L17\n", " \n", " \n", " L18\n", " \n", " \n", " L19\n", " \n", " \n", " L20\n", " \n", " \n", " M14\n", " \n", " \n", " M15\n", " \n", " \n", " M16\n", " \n", " \n", " M17\n", " \n", " \n", " M18\n", " \n", " \n", " M19\n", " \n", " \n", " M20\n", " \n", " \n", " \n", " \n", " \n", " \n", " route\n", " \n", " \n", " \n", " \n", " \n", " detour\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " OSS\n", " \n", " \n", " \n", " \n", " \n", " WTG\n", " \n", " \n", " \n", " \n", " \n", " corner\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gplot(G, node_tag='label', infobox=False, legend=True)" ] }, { "cell_type": "markdown", "id": "100ca73b-137a-45e7-b5b9-d565b4c43ed3", "metadata": {}, "source": [ "Alternatively, the internal index of the nodes can be shown instead of their labels:" ] }, { "cell_type": "code", "execution_count": 11, "id": "b76f549e-3f0c-4da1-8700-28dbadb8f09b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:29.575838\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " -2\n", " \n", " \n", " -1\n", " \n", " \n", " 0\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 7\n", " \n", " \n", " 8\n", " \n", " \n", " 9\n", " \n", " \n", " 10\n", " \n", " \n", " 11\n", " \n", " \n", " 12\n", " \n", " \n", " 13\n", " \n", " \n", " 14\n", " \n", " \n", " 15\n", " \n", " \n", " 16\n", " \n", " \n", " 17\n", " \n", " \n", " 18\n", " \n", " \n", " 19\n", " \n", " \n", " 20\n", " \n", " \n", " 21\n", " \n", " \n", " 22\n", " \n", " \n", " 23\n", " \n", " \n", " 24\n", " \n", " \n", " 25\n", " \n", " \n", " 26\n", " \n", " \n", " 27\n", " \n", " \n", " 28\n", " \n", " \n", " 29\n", " \n", " \n", " 30\n", " \n", " \n", " 31\n", " \n", " \n", " 32\n", " \n", " \n", " 33\n", " \n", " \n", " 34\n", " \n", " \n", " 35\n", " \n", " \n", " 36\n", " \n", " \n", " 37\n", " \n", " \n", " 38\n", " \n", " \n", " 39\n", " \n", " \n", " 40\n", " \n", " \n", " 41\n", " \n", " \n", " 42\n", " \n", " \n", " 43\n", " \n", " \n", " 44\n", " \n", " \n", " 45\n", " \n", " \n", " 46\n", " \n", " \n", " 47\n", " \n", " \n", " 48\n", " \n", " \n", " 49\n", " \n", " \n", " 50\n", " \n", " \n", " 51\n", " \n", " \n", " 52\n", " \n", " \n", " 53\n", " \n", " \n", " 54\n", " \n", " \n", " 55\n", " \n", " \n", " 56\n", " \n", " \n", " 57\n", " \n", " \n", " 58\n", " \n", " \n", " 59\n", " \n", " \n", " 60\n", " \n", " \n", " 61\n", " \n", " \n", " 62\n", " \n", " \n", " 63\n", " \n", " \n", " 64\n", " \n", " \n", " 65\n", " \n", " \n", " 66\n", " \n", " \n", " 67\n", " \n", " \n", " 68\n", " \n", " \n", " 69\n", " \n", " \n", " 70\n", " \n", " \n", " 71\n", " \n", " \n", " 72\n", " \n", " \n", " 73\n", " \n", " \n", " 74\n", " \n", " \n", " 75\n", " \n", " \n", " 76\n", " \n", " \n", " 77\n", " \n", " \n", " 78\n", " \n", " \n", " 79\n", " \n", " \n", " 80\n", " \n", " \n", " 81\n", " \n", " \n", " 82\n", " \n", " \n", " 83\n", " \n", " \n", " 84\n", " \n", " \n", " 85\n", " \n", " \n", " 86\n", " \n", " \n", " 87\n", " \n", " \n", " 88\n", " \n", " \n", " 89\n", " \n", " \n", " 90\n", " \n", " \n", " 91\n", " \n", " \n", " 92\n", " \n", " \n", " 93\n", " \n", " \n", " 94\n", " \n", " \n", " 95\n", " \n", " \n", " 96\n", " \n", " \n", " 97\n", " \n", " \n", " 98\n", " \n", " \n", " 99\n", " \n", " \n", " 100\n", " \n", " \n", " 101\n", " \n", " \n", " 102\n", " \n", " \n", " 103\n", " \n", " \n", " 104\n", " \n", " \n", " 105\n", " \n", " \n", " 106\n", " \n", " \n", " 107\n", " \n", " \n", " 108\n", " \n", " \n", " 109\n", " \n", " \n", " 110\n", " \n", " \n", " 111\n", " \n", " \n", " 112\n", " \n", " \n", " 113\n", " \n", " \n", " 114\n", " \n", " \n", " 115\n", " \n", " \n", " 116\n", " \n", " \n", " 117\n", " \n", " \n", " 118\n", " \n", " \n", " 119\n", " \n", " \n", " 120\n", " \n", " \n", " 121\n", " \n", " \n", " 122\n", " \n", " \n", " 123\n", " \n", " \n", " 124\n", " \n", " \n", " 125\n", " \n", " \n", " 126\n", " \n", " \n", " 127\n", " \n", " \n", " 128\n", " \n", " \n", " 129\n", " \n", " \n", " 130\n", " \n", " \n", " 131\n", " \n", " \n", " 132\n", " \n", " \n", " 133\n", " \n", " \n", " 134\n", " \n", " \n", " 135\n", " \n", " \n", " 136\n", " \n", " \n", " 137\n", " \n", " \n", " 138\n", " \n", " \n", " 139\n", " \n", " \n", " 140\n", " \n", " \n", " 141\n", " \n", " \n", " 142\n", " \n", " \n", " 143\n", " \n", " \n", " 144\n", " \n", " \n", " 145\n", " \n", " \n", " 146\n", " \n", " \n", " 147\n", " \n", " \n", " 148\n", " \n", " \n", " 149\n", " \n", " \n", " 150\n", " \n", " \n", " 151\n", " \n", " \n", " 152\n", " \n", " \n", " 153\n", " \n", " \n", " 154\n", " \n", " \n", " 155\n", " \n", " \n", " 156\n", " \n", " \n", " 157\n", " \n", " \n", " 158\n", " \n", " \n", " 159\n", " \n", " \n", " 160\n", " \n", " \n", " 161\n", " \n", " \n", " 162\n", " \n", " \n", " 163\n", " \n", " \n", " 164\n", " \n", " \n", " 165\n", " \n", " \n", " 166\n", " \n", " \n", " 167\n", " \n", " \n", " 168\n", " \n", " \n", " 169\n", " \n", " \n", " 170\n", " \n", " \n", " 171\n", " \n", " \n", " 172\n", " \n", " \n", " 173\n", " \n", " \n", " 174\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gplot(G, node_tag=True, infobox=False)" ] }, { "cell_type": "markdown", "id": "2a5748af-1d93-4920-a952-3e93e27c8d50", "metadata": {}, "source": [ "The nodes can also be tagged by the power they export towards the substation:" ] }, { "cell_type": "code", "execution_count": 12, "id": "3c8bbff6-e73b-44f8-932f-4d485763faa8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-12-01T17:38:30.175501\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.8, https://matplotlib.org/\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 83\n", " \n", " \n", " 92\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 7\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 7\n", " \n", " \n", " 1\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 6\n", " \n", " \n", " 7\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 7\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 5\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 6\n", " \n", " \n", " 6\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 7\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 6\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 4\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 6\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 7\n", " \n", " \n", " 6\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " \n", " \n", " \n", " \n", " κ = 7, T = 175\n", " (+4) SS-2: 15, SS-1: 14\n", " Σλ = 175 293 m\n", " 122 555 217 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gplot(G, node_tag='load')" ] }, { "cell_type": "markdown", "id": "ecc1bafd-e317-4091-af92-3634c225d91f", "metadata": {}, "source": [ "### Using `svgplot()`" ] }, { "cell_type": "code", "execution_count": 13, "id": "dda2f030-affa-4382-b4af-65a8fe602687", "metadata": {}, "outputs": [], "source": [ "from optiwindnet.svg import svgplot" ] }, { "cell_type": "markdown", "id": "191c9857-bdba-4c0e-a891-1e93530e76fb", "metadata": {}, "source": [ "Most plots in the examples are created with `svgplot()`. The figures are visually similar to the ones generated with `gplot`, except for the lack of the `node_tag` and `legend` options. The infobox position here is fixed to the lower-right corner, while `gplot()` tries to place it in the least-obtrusive position.\n", "\n", "The advantage of an SVG created by `svgplot()` over the one produced by Matplotlib is its smaller and simpler structure, which is also better suited for further editing (e.g. using Inkscape)." ] }, { "cell_type": "code", "execution_count": 14, "id": "1438999c-fc9d-4929-808b-d5545bb089da", "metadata": {}, "outputs": [], "source": [ "import networkx as nx" ] }, { "cell_type": "code", "execution_count": 15, "id": "4de6a9f8-18da-4f9a-9346-89ed53ab3488", "metadata": {}, "outputs": [], "source": [ "# disable cable type encoding by resetting cable assignments\n", "del G.graph['cables']\n", "nx.set_edge_attributes(G, 0, 'cable')\n", "# disable cost display by removing currency\n", "del G.graph['currency']" ] }, { "cell_type": "code", "execution_count": 16, "id": "2389b968-027d-42fb-904b-8bfff20400b1", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 175 293 m(+4) SS-2: 15, SS-1: 14κ = 7, T = 175" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(G)" ] }, { "cell_type": "markdown", "id": "f2651184-c288-4c81-ae8a-0827585ea6f3", "metadata": {}, "source": [ "The `svgplot()` does not create an inline image upon being called, the SVG is displayed when the object returned by the `svgplot()` call is the cell output. To display figures created within the code cell, use `IPython.display.display`.\n", "\n", "To save to a file:\n", "```python\n", "svgplot(G).save('myfig.svg')\n", "```" ] }, { "cell_type": "code", "execution_count": 17, "id": "2d39a777-a0ab-4259-a5ba-15a5be18f0ec", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 157 743 m(+2) SS-2: 12, SS-1: 10κ = 9, T = 175" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 175 293 m(+4) SS-2: 15, SS-1: 14κ = 7, T = 175" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 203 309 m(+2) SS-2: 18, SS-1: 19κ = 5, T = 175" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for cap in [9, 7, 5]:\n", " S = EW_presolver(A, capacity=cap)\n", " Gʹ = G_from_S(S, A)\n", " G = PathFinder(Gʹ, planar=P, A=A).create_detours()\n", " display(svgplot(G))" ] }, { "cell_type": "markdown", "id": "1226bc83-bd3c-45db-bbb1-aa88224ff2c9", "metadata": {}, "source": [ "### Dark and Light plotting themes" ] }, { "cell_type": "markdown", "id": "fbbf39e7-b228-4142-93d5-1f757d8c0e5f", "metadata": {}, "source": [ "Both `gplot()` and `svgplot()` try to match the colors used in the figure to the operating system's theme via Python package `darkdetect`. This package detects the system's theme and not JupyterLab's theme, so it may lead to non-ideal results if they do not match.\n", "\n", "The example notebooks are created from a dark-themed system, but the figures might have a light background when the notebooks are run on a different computer.\n", "\n", "The theme can be enforced programmatically by setting the argument `dark` to `True` or `False`:" ] }, { "cell_type": "code", "execution_count": 18, "id": "09b9bc08-7048-4116-b5d2-0226ebeb2037", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 203 309 m(+2) SS-2: 18, SS-1: 19κ = 5, T = 175" ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(G, dark=False)" ] }, { "cell_type": "markdown", "id": "334b548e-acd4-41c4-93e0-d715b1b0c5f4", "metadata": {}, "source": [ "### Rotated locations" ] }, { "cell_type": "markdown", "id": "f0f10ebf-ffcb-4cd9-85fc-c95b7d0a2416", "metadata": {}, "source": [ "Each location included in OptiWindNet has a graph attribute called 'landscape_angle'." ] }, { "cell_type": "code", "execution_count": 19, "id": "c38128f0-22b3-400b-9604-48d423d6c25e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-95" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "L.graph['landscape_angle']" ] }, { "cell_type": "markdown", "id": "78a9cadd-93d2-4fa8-a37f-f08947b6fa3e", "metadata": {}, "source": [ "This is the angle that will rotate the site to be in the best orientation for a landscape figure. If the user prefers the orientation to be with the north always up, the argument `landscape` can be used. Alternatively, 'landscape_angle' could be set to 0." ] }, { "cell_type": "code", "execution_count": 20, "id": "b7e9d975-9bb2-4fc8-a841-c50e4f948e0c", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 203 309 m(+2) SS-2: 18, SS-1: 19κ = 5, T = 175" ], "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(G, landscape=False)" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }