{ "cells": [ { "cell_type": "markdown", "id": "ed13a6b8-1d5b-4ce0-9cd4-b81bac7b07dd", "metadata": {}, "source": [ "# Plotting" ] }, { "cell_type": "markdown", "id": "fcfe6476", "metadata": {}, "source": [ "This notebook explains the main plotting functions available for a `WindFarmNetwork (wfn)` instance. There are **five primary plots** which become available in different stages:\n", "\n", "\n", "- Plots available **immediately after initialization** of the `wfn` object:\n", "\n", " - `wfn.plot_location()`\n", "\n", " - `wfn.plot_navigation_mesh()`\n", "\n", " - `wfn.plot_available_links()`\n", "\n", "- Plot available **after running the optimization** (`wfn.optimize()`):\n", "\n", " - `wfn.plot_selected_links()`\n", " - `wfn.plot()`\n", "\n", "For most users, only `wfn.plot_location()` and `wfn.plot()` are typically needed, so we present these plots first. \n", "The remaining plots are more relevant for **debugging** and **development purposes**, and are discussed in the advanced section below.\n", "\n", "👉 [Jump to advanced plotting details](#advanced-plotting-details)" ] }, { "cell_type": "markdown", "id": "333661b0", "metadata": {}, "source": [ "## Plotting `L` and `G`" ] }, { "cell_type": "markdown", "id": "3bad0d73", "metadata": {}, "source": [ "### Import required modules" ] }, { "cell_type": "code", "execution_count": 1, "id": "b0f61785-6be5-4a0f-8282-5c17f4cc28ad", "metadata": {}, "outputs": [], "source": [ "from optiwindnet.api import WindFarmNetwork, load_repository" ] }, { "cell_type": "code", "execution_count": 2, "id": "2f7f3fb1", "metadata": {}, "outputs": [], "source": [ "# Display figures as SVG in Jupyter notebooks\n", "%config InlineBackend.figure_formats = ['svg']" ] }, { "cell_type": "markdown", "id": "3f8789d4-5f85-4e50-a7b6-dd9b57f0e4a2", "metadata": {}, "source": [ "### Create a sample network\n", "\n", "> Note: the `load_repository()` functionality of `OptiWindNet` is used to load a prebuilt *Networkx.Graph* of the avaible locations. For more details on this functionality look into the notebook about [Load repositories containing location data](a03_load_repositories.ipynb)." ] }, { "cell_type": "code", "execution_count": 3, "id": "4e702047", "metadata": {}, "outputs": [], "source": [ "locations = load_repository()\n", "wfn = WindFarmNetwork(L=locations.anholt, cables=[(2, 1500.0), (5, 1800.0)])" ] }, { "cell_type": "markdown", "id": "5fab2b53", "metadata": {}, "source": [ "### Plot location geometry (`L`):\n", "\n", "`L` contains only the **raw location data**, such as turbine and substation coordinates, borders, and obstacles, **without any links or connections** between nodes.\n", "\n", "As a result, `wfn.plot_location()` will appear as an **empty graph**, showing only the individual elements without network links/edges.\n", "\n", "This plot is useful to make sure the `WindFarmNetwork()` instance is initialized properly, before running the optimization." ] }, { "cell_type": "code", "execution_count": 4, "id": "f88ccb3c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:24:56.387971\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_location()" ] }, { "cell_type": "markdown", "id": "e01d4da1", "metadata": {}, "source": [ ">**Tip.** In a notebook, just put `wfn` as the last line of a cell for plotting G.\n", ">\n", ">* Before optimization (no `G` yet), it renders the location geometry `L`.\n", ">* If `G` exists (e.g. after a `optimize()` is run), it automatically renders `G`." ] }, { "cell_type": "code", "execution_count": 5, "id": "eeb09ee1", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wfn" ] }, { "cell_type": "markdown", "id": "13554c48", "metadata": {}, "source": [ "### Optimize\n", "\n", "To plot and visualize the optimized network, an optimization needs to be performed first. For the sake of simplicity, we run the optimization with the default router in `OptiWindNet` (i.e. `Heuristics-Esau_Williams`)." ] }, { "cell_type": "code", "execution_count": 6, "id": "f888963b", "metadata": {}, "outputs": [], "source": [ "res = wfn.optimize()" ] }, { "cell_type": "markdown", "id": "9a43d824", "metadata": {}, "source": [ "### Plot the Optimized Network Graph\n", "The optimized network graph (G) represents the optimized network with actual routes.\n", "\n", "Accordingly, `wfn.plot()` displays the routes for selected links in the **optimized network**. The detoured routes are displayed via dashed lines. Detours are the routes created to resolve crossing feeders." ] }, { "cell_type": "code", "execution_count": 7, "id": "883efe11", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:24:58.266703\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot()" ] }, { "cell_type": "markdown", "id": "8814596b", "metadata": {}, "source": [ "> ! Reminder: In a notebook, we can plot the optimized network simply by calling `wfn`:" ] }, { "cell_type": "code", "execution_count": 8, "id": "29dcc789", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "362839147 €Σλ = 208676.0 m(+0) OSS: 23κ = 5, T = 111" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wfn" ] }, { "cell_type": "markdown", "id": "9cc236bf-61b1-43b7-90d0-a866e32eb1f2", "metadata": {}, "source": [ "### Plot in a pre-existing axes\n", "\n", "It is also possible to provide a pre-existing `plt.Axes` object within a matplotlib figure:" ] }, { "cell_type": "code", "execution_count": 9, "id": "64669b15", "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-08-26T19:24:58.629865\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.rcParams['svg.fonttype'] = 'none'\n", "fig, (ax1, ax2) = plt.subplots(1, 2, facecolor='none', figsize=(8, 4))\n", "\n", "wfn.plot_location(ax=ax1)\n", "wfn.plot(ax=ax2)" ] }, { "cell_type": "markdown", "id": "417ec8c1", "metadata": {}, "source": [ " We can add tags to the nodes. For more details on this functionality look into the notebook about [plotting](a04_Plotting.ipynb)" ] }, { "cell_type": "markdown", "id": "bc70750c", "metadata": {}, "source": [ "### 📊 Plotting Properties" ] }, { "cell_type": "markdown", "id": "a41f283c-8d65-4f29-a5e7-2ef05f0ecbf3", "metadata": {}, "source": [ "In `OptiWindNet`, users can customize plotting properties such as *node tags* and *legends* to control how turbines and substations are displayed in the visual output.\n", "\n", "#### 🏷️ Node Tags\n", "\n", "Node tags are used to label turbine and substation nodes in plots and outputs. Tags can be either automatically generated or manually specified.\n", "\n", "1. **Automatically Generated Tags**\n", "\n", "* These are generated by `OptiWindNet`:\n", "* *Turbines* (non-negative indices):\n", " Tags follow the order in which turbines appear in the input list.\n", "* *Substations* (negative indices):\n", " Tags follow the order in which substations appear in the input list with negaive sign in front.\n", "\n", "2. **Manually Provided Tags**\n", "\n", " * Tags can be manually defined in either the associated `.yaml` or `.osm.pbf` files. In `OptiWindNet`.\n", " * These tags are used to label nodes for identification or analysis.\n", "\n", "\n", "##### ⚙️ Tag Display Logic\n", "\n", "The behavior is controlled via the `node_tag` parameter:\n", "\n", "| node_tag value | Behavior |\n", "| -------------------- | ------------------------------------------------------------------------------------------------------- |\n", "| `node_tag=True` | Automatically generated tags will be displayed on nodes. |\n", "| `node_tag='load'` | Tags the nodes by number of turbines routed through node. |\n", "| `node_tag='any user-defined node attribute'` | Uses custom attributes from the `.yaml` file, if provided. |\n", "\n", "\n", "##### 🔤 Tag Formatting Guidelines\n", "\n", "* Turbines are plotted as *circles*, and substations as *rectangles*.\n", "* The default symbol sizes are optimized for *tags with up to three characters** using the default font size.\n", " * *Recommendation:* If providing manual tags in `.yaml` files, limit them to *three characters* to ensure proper display and alignment." ] }, { "cell_type": "markdown", "id": "96abc2de", "metadata": {}, "source": [ "##### **Automatically Generated Tags**\n", "\n", "These tags are generated by `OptiWindNet`:\n", "\n", "* *Turbines* (non-negative indices):\n", " Tags follow the order in which turbines appear in the input list.\n", "* *Substations* (negative indices):\n", " Tags follow the order in which substations appear in the input list with negaive sign in front." ] }, { "cell_type": "code", "execution_count": 10, "id": "6a4b7e32", "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-08-26T19:25:00.393420\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " -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", " \n", " \n", " \n", " \n", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot(node_tag=True)" ] }, { "cell_type": "markdown", "id": "c218572d", "metadata": {}, "source": [ "##### **Manually Provided Tags**\n", "\n", "Tags can be manually defined in either the associated `.yaml` or `.osm.pbf` files. In `OptiWindNet`, these tags are used to label nodes for identification or analysis.\n", "\n", "\n", "**• `.yaml` files:**\n", "\n", "In `.yaml` files, any text defined *before* the coordinate is interpreted as a node label (`label` attribute).\n", "Example:\n", "\n", "```yaml\n", "SUBSTATIONS: |-\n", " OSS 56°35.748'N 11°09.174'E\n", "\n", "TURBINES: |-\n", " A01 56°30.477'N 11°11.026'E\n", " A02 56°30.810'N 11°11.078'E\n", " A03 56°31.144'N 11°11.123'E\n", " A04 56°31.478'N 11°11.159'E\n", " A05 56°31.813'N 11°11.187'E\n", "```\n", "\n", "Here, `OSS`, `A01`, `A02`, etc., are node labels.\n", "\n", "\n", "**• `.osm.pbf` files:**\n", "\n", "In `.osm.pbf` files, node labels are automatically taken from the `name`, or `ref` attribute (if present) in the OpenStreetMap data.\n", "\n", "Example (OSM XML structure):\n", "\n", "```xml\n", "\n", " \n", " \n", "\n", "```\n", "\n", "In this case, the node will be tagged with the label `\"OSS\"`." ] }, { "cell_type": "code", "execution_count": 11, "id": "4e41efbe-054c-4949-9880-95c9029e3017", "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-08-26T19:25:01.391960\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " OSS\n", " \n", " \n", " A01\n", " \n", " \n", " A02\n", " \n", " \n", " A03\n", " \n", " \n", " A04\n", " \n", " \n", " A05\n", " \n", " \n", " A06\n", " \n", " \n", " A07\n", " \n", " \n", " A08\n", " \n", " \n", " A09\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", " A16\n", " \n", " \n", " A17\n", " \n", " \n", " A18\n", " \n", " \n", " A19\n", " \n", " \n", " A20\n", " \n", " \n", " A22\n", " \n", " \n", " A23\n", " \n", " \n", " A24\n", " \n", " \n", " A25\n", " \n", " \n", " A26\n", " \n", " \n", " A27\n", " \n", " \n", " A28\n", " \n", " \n", " A29\n", " \n", " \n", " A30\n", " \n", " \n", " A31\n", " \n", " \n", " B01\n", " \n", " \n", " C01\n", " \n", " \n", " C02\n", " \n", " \n", " C03\n", " \n", " \n", " C04\n", " \n", " \n", " C05\n", " \n", " \n", " C06\n", " \n", " \n", " C07\n", " \n", " \n", " C09\n", " \n", " \n", " C10\n", " \n", " \n", " C12\n", " \n", " \n", " C31\n", " \n", " \n", " D01\n", " \n", " \n", " E01\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", " F23\n", " \n", " \n", " F24\n", " \n", " \n", " F25\n", " \n", " \n", " F26\n", " \n", " \n", " F27\n", " \n", " \n", " F28\n", " \n", " \n", " F29\n", " \n", " \n", " G01\n", " \n", " \n", " H01\n", " \n", " \n", " I01\n", " \n", " \n", " I02\n", " \n", " \n", " I03\n", " \n", " \n", " I04\n", " \n", " \n", " I05\n", " \n", " \n", " I07\n", " \n", " \n", " I08\n", " \n", " \n", " I10\n", " \n", " \n", " I28\n", " \n", " \n", " J01\n", " \n", " \n", " K01\n", " \n", " \n", " L01\n", " \n", " \n", " L02\n", " \n", " \n", " L03\n", " \n", " \n", " L04\n", " \n", " \n", " L05\n", " \n", " \n", " L06\n", " \n", " \n", " M01\n", " \n", " \n", " P01\n", " \n", " \n", " P02\n", " \n", " \n", " P03\n", " \n", " \n", " P04\n", " \n", " \n", " P05\n", " \n", " \n", " P06\n", " \n", " \n", " P07\n", " \n", " \n", " P08\n", " \n", " \n", " P09\n", " \n", " \n", " P10\n", " \n", " \n", " P11\n", " \n", " \n", " P12\n", " \n", " \n", " P13\n", " \n", " \n", " P15\n", " \n", " \n", " P16\n", " \n", " \n", " P17\n", " \n", " \n", " P19\n", " \n", " \n", " P20\n", " \n", " \n", " P21\n", " \n", " \n", " P22\n", " \n", " \n", " P23\n", " \n", " \n", " P24\n", " \n", " \n", " P25\n", " \n", " \n", " P26\n", " \n", " \n", " P27\n", " \n", " \n", " P28\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": [ "wfn.plot(node_tag='label', infobox=False, legend=True)" ] }, { "cell_type": "code", "execution_count": 12, "id": "dd74ab60", "metadata": {}, "outputs": [], "source": [ "wfn.L.nodes[0]['example_label']='T0'" ] }, { "cell_type": "code", "execution_count": 13, "id": "dc6d5497", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:01.808333\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " T0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_location(node_tag='example_label')" ] }, { "cell_type": "markdown", "id": "2a5748af-1d93-4920-a952-3e93e27c8d50", "metadata": {}, "source": [ "The nodes can also be tagged with the amount of power they export towards the substation:\n", "- The load number of a node corresponds to the number of turbines connected through it, indicating how many turbines’ power is routed via that node on the way to the substation.\n", "- The substations will be taged with total number of connected turbines." ] }, { "cell_type": "code", "execution_count": 14, "id": "3c8bbff6-e73b-44f8-932f-4d485763faa8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:02.585974\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " 111\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\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", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 4\n", " \n", " \n", " 1\n", " \n", " \n", " 5\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 2\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 5\n", " \n", " \n", " 1\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", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 4\n", " \n", " \n", " 1\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 4\n", " \n", " \n", " 1\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\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", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4\n", " \n", " \n", " 5\n", " \n", " \n", " 1\n", " \n", " \n", " 3\n", " \n", " \n", " 1\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\n", " \n", " \n", " 5\n", " \n", " \n", " 4\n", " \n", " \n", " 3\n", " \n", " \n", " 2\n", " \n", " \n", " 1\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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot(node_tag='load')" ] }, { "cell_type": "markdown", "id": "fbbf39e7-b228-4142-93d5-1f757d8c0e5f", "metadata": {}, "source": [ "#### Theme of plots\n", "\n", "The plots are visualized trying 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 no 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": 15, "id": "09b9bc08-7048-4116-b5d2-0226ebeb2037", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:02.894724\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot(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": 16, "id": "c38128f0-22b3-400b-9604-48d423d6c25e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "82" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wfn.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 (as opposed to portrait). 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": 17, "id": "5a69abdd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:03.352586\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 208676.0 m\n", " 362839147 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot(landscape=False)" ] }, { "cell_type": "markdown", "id": "f94d14b7", "metadata": {}, "source": [ "## Advanced Plotting Details\n" ] }, { "cell_type": "markdown", "id": "ef306c5b", "metadata": {}, "source": [ "As mentioned at the begining, there are **five primary plots** which become available in different stages:\n", "\n", "- Plots available **immediately after initialization** of the `wfn` object:\n", "\n", " - `wfn.plot_location()`\n", " → Displays turbine and substation locations, borders, and obstacles.\n", "\n", " - `wfn.plot_navigation_mesh()`\n", " → Displays the triangulated navigation mesh (planar embedding).\n", "\n", " - `wfn.plot_available_links()`\n", " → Displays available links in the search space.\n", "\n", "- Plots available **after running the optimization** (`wfn.optimize()`):\n", "\n", " - `wfn.plot_selected_links()`\n", " → Displays the **selected links** in the optimized network. A *link* represents an **abstract connection** between two nodes (e.g., turbines and substations), without considering the actual physical path.\n", "\n", " - `wfn.plot()`\n", " → Displays the **actual cable routes** for the selected links. A **route** is the **physical path** the cable takes through the site, including contours to respect borders/obstacles and **detours** to resolve crossing feeders.\n", "\n", "Two plots (`wfn.plot_location()` and `wfn.plot()`) are presented above. The remaining plots (`navigation_mesh`, `available_links`, and `selected_links` which are more relevant for **debugging** and **development purposes**) are discussed in this section.\n" ] }, { "cell_type": "markdown", "id": "32641de9", "metadata": {}, "source": [ "### Plot navigation mesh" ] }, { "cell_type": "markdown", "id": "2a6bf78f", "metadata": {}, "source": [ "The corresponding graph contains a mesh generated by **constrained Delaunay triangulation**, represented as a planar embedding; a graph that can be embedded in 2D without any crossing." ] }, { "cell_type": "code", "execution_count": 18, "id": "494da4c3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:03.510067\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_navigation_mesh()" ] }, { "cell_type": "markdown", "id": "0e502746", "metadata": {}, "source": [ "### Plot Available Links" ] }, { "cell_type": "markdown", "id": "ed2e8809", "metadata": {}, "source": [ "The corresponding graph contains all **available links in the search space** derived from the **Delaunay triangulation**, and additional **diagonal links**.\n", "\n", "The available link graph (A) is the primary graph used by downstream algorithms for **optimization**.\n", "\n", "`wfn.plot_available_links()`\n", "\n", "This plots displays the available links using different **line styles and colors** to distinguish link types:\n", "\n", "* **Line format:**\n", "\n", " * **Solid lines**: direct Delaunay links\n", " * **Dashed lines**: diagonal or extended links\n", "\n", "* **Line color:**\n", "\n", " * in the **dark** theme:\n", " * **Cyan**: unobstructed (valid) links\n", " * **Green**: obstructed links (e.g., crossing obstacles)\n", "\n", " * in the **light** theme:\n", " * **Green**: unobstructed (valid) links\n", " * **Red**: obstructed links (e.g., crossing obstacles)\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "ed782ca3", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:03.735852\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_available_links()" ] }, { "cell_type": "code", "execution_count": 20, "id": "3a859def", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:04.018849\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_available_links(dark=False)" ] }, { "cell_type": "markdown", "id": "f3e63aae", "metadata": {}, "source": [ "### Plot Selected Links" ] }, { "cell_type": "markdown", "id": "56e65d53", "metadata": {}, "source": [ "`wfn.plot_selected_links()` displays the **links selected** in the optimized network from among all available links." ] }, { "cell_type": "code", "execution_count": 21, "id": "2d98f576", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " 2025-08-26T19:25:04.318873\n", " image/svg+xml\n", " \n", " \n", " Matplotlib v3.10.1, 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", " κ = 5, T = 111\n", " (+0) OSS: 23\n", " Σλ = 205051.0 m\n", " 356313585 €\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wfn.plot_selected_links()" ] }, { "cell_type": "markdown", "id": "1f812815", "metadata": {}, "source": [ "To clarify the difference between `wfn.plot_selected_links()` and `wfn.plot()`, it's important to distinguish between a *link* and a *route*:\n", "\n", "* A **link** is an **abstract connection** between two nodes (e.g., turbine to substation), without considering the actual physical path.\n", " *(Displayed by `wfn.plot_selected_links()`)*\n", "\n", "* A **route** is the **physical path** the cable takes through the site, including contours to respect borders/obstacles and **detours** to resolve crossing-feeders.\n", " *(Displayed by `wfn.plot()`)*\n", "\n", ">For a detailed explanation and visuals, read this paper:\n", ">**To be added: \\[link to paper]**" ] } ], "metadata": { "kernelspec": { "display_name": "OptiWindNet", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" } }, "nbformat": 4, "nbformat_minor": 5 }