~tfardet/nngt-developers

NNGT: Doc+Plot: move to Furo + directed chord diagram v1 PROPOSED

~tfardet: 1
 Doc+Plot: move to Furo + directed chord diagram

 25 files changed, 95 insertions(+), 437 deletions(-)
#852097 .build.yml success
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~tfardet/nngt-developers/patches/35652/mbox | git am -3
Learn more about email & git

[PATCH NNGT] Doc+Plot: move to Furo + directed chord diagram Export this patch

From: Tanguy Fardet <tanguyfardet@protonmail.com>

---
 README.md                                     |   7 +-
 doc/_static/custom.css                        |  24 ++
 doc/_templates/base.html                      |   5 +
 doc/_templates/customtoc.html                 |   6 -
 doc/_templates/layout.html                    |   6 -
 doc/_templates/nngt_logo.png                  | Bin 13400 -> 0 bytes
 doc/conf.py                                   |  81 ++---
 doc/developer/contributing.rst                |   4 -
 .../graph_structure/plot_chord_diagram.py     |   9 +-
 doc/index.rst                                 |   3 +
 doc/modules/database.rst                      |   4 -
 doc/modules/nngt.rst.in                       |   3 -
 doc/modules/nngt/graph-classes.rst.in         |   3 -
 doc/modules/nngt/side-classes.rst.in          |   3 -
 doc/nngt_theme/static/nngt_theme.css          | 302 ------------------
 doc/nngt_theme/theme.conf                     |   4 -
 doc/user/activity-analysis.rst                |   3 -
 doc/user/component-properties.rst             |   5 -
 doc/user/graph-generation.rst                 |   6 -
 doc/user/nest-interaction.rst                 |   6 -
 doc/user/neural-groups.rst                    |   5 -
 doc/user/parallelism.rst                      |   3 -
 doc/user/tutorial.rst                         |   6 -
 nngt/generation/func_connect.h                |  14 +-
 nngt/plot/plt_networks.py                     |  20 +-
 25 files changed, 95 insertions(+), 437 deletions(-)
 create mode 100644 doc/_static/custom.css
 create mode 100644 doc/_templates/base.html
 delete mode 100755 doc/_templates/customtoc.html
 delete mode 100644 doc/_templates/layout.html
 delete mode 100755 doc/_templates/nngt_logo.png
 delete mode 100755 doc/nngt_theme/static/nngt_theme.css
 delete mode 100755 doc/nngt_theme/theme.conf

diff --git a/README.md b/README.md
index 8ea1457..71b6133 100755
--- a/README.md
+++ b/README.md
@@ -18,9 +18,14 @@ activity simulators to make the study of neuronal activity as easy and
efficient as possible.

Source code is available and contributions are accepted on
[SourceHut](https://sr.ht/~tfardet/NNGT) and
[SourceHut](https://sr.ht/~tfardet/NNGT) (preferred),
[Codeberg](https://codeberg.org/tfardet/NNGT), and
[GitHub](https://github.com/tfardet/NNGT).

For questions or issues, please check the
[mailing list](https://lists.sr.ht/~tfardet/nngt-users) and the
[issue tracker](https://codeberg.org/tfardet/NNGT/issues).


## Principle

diff --git a/doc/_static/custom.css b/doc/_static/custom.css
new file mode 100644
index 0000000..ef90ae8
--- /dev/null
+++ b/doc/_static/custom.css
@@ -0,0 +1,24 @@
footer {
    font-size: 95%;
}

.toc-drawer {
    font-size: 110%;
}

.sidebar-logo {
    max-width: 90% !important;
}

.sphx-glr-thumbnails{
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)) !important;
}

.sphx-glr-thumbcontainer img {
  max-height: 320px !important;
  max-width: 320px !important;
}

.admonition {
    font-size: 90%;
}
diff --git a/doc/_templates/base.html b/doc/_templates/base.html
new file mode 100644
index 0000000..59dc79b
--- /dev/null
+++ b/doc/_templates/base.html
@@ -0,0 +1,5 @@
{% extends "!base.html" %}
{% block site_meta %}
    <meta name="keywords" content="nngt, network, graph, topology, complex networks, networkx, igraph, graph-tool, neuron, neuronal, python, nest" />
    <meta name="description" content="Documentation for the python module NNGT, aimed at generating and analyzing complex graphs, with specific additions for GIS and to describe neuronal networks plus interface them with simulators." />
{% endblock %}
diff --git a/doc/_templates/customtoc.html b/doc/_templates/customtoc.html
deleted file mode 100755
index 899200a..0000000
--- a/doc/_templates/customtoc.html
@@ -1,6 +0,0 @@
<a href={{ pathto(master_doc) }}><img class="logo" src={{ pathto("_static/nngt_logo.svg",1) }}></a>
<p class="toctitle">Table of content</p>
<ul class="globaltoc">
    {{ toctree(maxdepth=-1, collapse=True,includehidden=True) }}
</ul>
<br />
diff --git a/doc/_templates/layout.html b/doc/_templates/layout.html
deleted file mode 100644
index 0e7863b..0000000
--- a/doc/_templates/layout.html
@@ -1,6 +0,0 @@
{% extends "!layout.html" %}
{% block extrahead %}
    {{ super() }}
    <meta name="keywords" content="nngt, neuron, network, graph, topology, neuronal, python, nest" />
    <meta name="description" content="Documentation for the python module NNGT, aimed at describing neuronal networks and interfacing them with simulators." />
{% endblock %}
diff --git a/doc/_templates/nngt_logo.png b/doc/_templates/nngt_logo.png
deleted file mode 100755
index 2cd83f6cdcad7a7c98608d336bee902bc0eb6458..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 13400
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
K64hb`LH_~d&y}12

diff --git a/doc/conf.py b/doc/conf.py
index c8a98a2..b125bbb 100755
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -228,6 +228,7 @@ extensions = [
    'linksourcecode',
    'extlinks_fancy',
    'sphinx_gallery.gen_gallery',
    'sphinx_copybutton',
]

# Add any paths that contain templates here, relative to this directory.
@@ -268,7 +269,7 @@ release = nngt_version
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
language = 'en'

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
@@ -309,75 +310,45 @@ todo_include_todos = False

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
#~ html_theme = 'sphinx_rtd_theme'

html_theme = 'nngt_theme'
html_theme_path = ["."] + sphinx_bootstrap_theme.get_html_theme_path()
html_use_smartypants = False
html_theme = 'furo'

html_sidebars = {
    "**": [
        "sidebar/scroll-start.html",
        "sidebar/brand.html",
        "sidebar/search.html",
        "sidebar/navigation.html",
        "sidebar/scroll-end.html",
    ]
}

html_theme_options = {
    # A list of tuples containing pages or urls to link to.
    # Valid tuples should be in the following forms:
    #    (name, page)                 # a link to a page
    #    (name, "/aa/bb", 1)          # a link to an arbitrary relative url
    #    (name, "http://example.com", True) # arbitrary absolute url
    # Note the "1" or "True" value above as the third argument to indicate
    # an arbitrary url.
    'navbar_links': [
        ("Modules", "py-modindex"),
        ("Index", "genindex"),
        ("SourceHut", "https://git.sr.ht/~tfardet/NNGT", True),
        ("GitHub", "https://github.com/tfardet/NNGT", True),
    ],

    # Render the next and previous page links in navbar. (Default: true)
    'navbar_sidebarrel': False,

    # Render the current pages TOC in the navbar. (Default: true)
    'navbar_pagenav': True,

    # Tab name for the current pages TOC. (Default: "Page")
    'navbar_pagenav_name': "Current",

    # Global TOC depth for "site" navbar tab. (Default: 1)
    # Switching to -1 shows all levels.
    'globaltoc_depth': 2,

    # Include hidden TOCs in Site navbar?
    #
    # Note: If this is "false", you cannot have mixed ``:hidden:`` and
    # non-hidden ``toctree`` directives in the same page, or else the build
    # will break.
    #
    # Values: "true" (default) or "false"
    'globaltoc_includehidden': "true",

    # Fix navigation bar to top of page?
    # Values: "true" (default) or "false"
    'navbar_fixed_top': "false",

    # Location of link to source.
    # Options are "nav" (default), "footer" or anything else to exclude.
    'source_link_position': "",

    # Bootswatch (http://bootswatch.com/) theme.
    'bootswatch_theme': "yeti"
    "light_css_variables": {
        "color-brand-primary": "#527fbf",
        "color-brand-content": "#527fbf",
    },
    "dark_css_variables": {
        "color-brand-primary": "#82afdf",
        "color-brand-content": "#82afdf",
    },
}

html_sidebars = {'**': ['customtoc.html', 'searchbox.html']}
html_css_files = [
    'custom.css',
]


# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
html_title = f'NNGT {nngt.__version__}'

# A shorter title for the navigation bar.  Default is the same as html_title.
#html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#~ html_logo = 'images/nngt_logo.png'
#~ html_logo = 'images/nngt_ico.png'
html_logo = '_static/nngt_logo.svg'

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
diff --git a/doc/developer/contributing.rst b/doc/developer/contributing.rst
index 9a9095f..e6faa0c 100644
--- a/doc/developer/contributing.rst
+++ b/doc/developer/contributing.rst
@@ -3,10 +3,6 @@ Contributing to NNGT
====================


.. contents::
   :local:


Signaling issues and bugs
=========================

diff --git a/doc/examples/graph_structure/plot_chord_diagram.py b/doc/examples/graph_structure/plot_chord_diagram.py
index d3fe9eb..e99481f 100644
--- a/doc/examples/graph_structure/plot_chord_diagram.py
+++ b/doc/examples/graph_structure/plot_chord_diagram.py
@@ -42,7 +42,7 @@ names = ["R1", "R2", "R3", "R4"]

struct = nngt.Structure.from_groups((room1, room2, room3, room4), names)

g = nngt.Graph(structure=struct)
g = nngt.Graph(structure=struct, directed=True)

for room in struct:
    nngt.generation.connect_groups(g, room, room, "all_to_all")
@@ -59,5 +59,10 @@ nngt.generation.connect_groups(g, room4, room3, "erdos_renyi", avg_deg=10)

sg = g.get_structure_graph()

# undirected version of the chord diagram
nngt.plot.chord_diagram(sg, names="name", sort="distance", fontcolor="grey",
                        use_gradient=True, show=True)
                        use_gradient=True, directed=False, show=False)

# directed chord diagram
nngt.plot.chord_diagram(sg, names="name", sort="distance", fontcolor="grey",
                        use_gradient=True, directed=True, show=True)
diff --git a/doc/index.rst b/doc/index.rst
index ed1edd9..a25cd5c 100755
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -92,6 +92,9 @@ The docs
   :caption: Contributing

   developer/contributing
   SourceHut <https://git.sr.ht/~tfardet/NNGT>
   Codeberg <https://codeberg.org/tfardet/NNGT>
   GitHub <https://github.com/tfardet/NNGT>

.. toctree::
   :glob:
diff --git a/doc/modules/database.rst b/doc/modules/database.rst
index 5e6cd51..292491c 100755
--- a/doc/modules/database.rst
+++ b/doc/modules/database.rst
@@ -11,10 +11,6 @@ The commands are then used by calling ``nngt.database`` to access the database
tools.


.. contents::
   :local:


Functions
---------

diff --git a/doc/modules/nngt.rst.in b/doc/modules/nngt.rst.in
index a33c71b..09f6d45 100644
--- a/doc/modules/nngt.rst.in
+++ b/doc/modules/nngt.rst.in
@@ -4,9 +4,6 @@
Main module (API)
=================

.. contents:: Overview
   :local:

For more details regarding the main classes, see:

.. toctree::
diff --git a/doc/modules/nngt/graph-classes.rst.in b/doc/modules/nngt/graph-classes.rst.in
index c2f1705..6fb8d86 100644
--- a/doc/modules/nngt/graph-classes.rst.in
+++ b/doc/modules/nngt/graph-classes.rst.in
@@ -19,9 +19,6 @@ Unless specified, child classes can use all methods from the parent class
(the only exception is :meth:`~nngt.Graph.set_types` which is not available
to the :class:`~nngt.Network` subclasses).

.. contents::
   :local:


Summary of the class members and methods
----------------------------------------
diff --git a/doc/modules/nngt/side-classes.rst.in b/doc/modules/nngt/side-classes.rst.in
index 9036617..2c2486b 100755
--- a/doc/modules/nngt/side-classes.rst.in
+++ b/doc/modules/nngt/side-classes.rst.in
@@ -21,9 +21,6 @@ Unless specified, child classes can use all methods from the parent class
:class:`~nngt.MetaNeuralGroup` inherit from :class:`~nngt.Group` while
:class:`~nngt.NeuralPop` inherits from :class:`~nngt.Structure`).

.. contents::
   :local:


Group
+++++
diff --git a/doc/nngt_theme/static/nngt_theme.css b/doc/nngt_theme/static/nngt_theme.css
deleted file mode 100755
index 60ce9f4..0000000
--- a/doc/nngt_theme/static/nngt_theme.css
@@ -1,302 +0,0 @@
@import url("bootstrap-sphinx.css");

:root {
    --bg-color: #ffffff;
    --fg-color: #000000;
    --nv-color: #333333;
    --hv-color: #eeeeee;
    --sb-color: #f7f5fa;
    --dt-color: #f3f3fb;
    --alert-info: #5bc0de;
    --admonition-a: #555555;
    --a-color: #008cba;
    --highlighted: #fbe54e;
}

@media (prefers-color-scheme: dark) {
    :root {
        --bg-color: #222222;
        --fg-color: #eeeeee;
        --nv-color: #dddddd;
        --hv-color: #333333;
        --sb-color: #3f3f3f;
        --dt-color: #111111;
        --alert-info: #1e7bb3;
        --admonition-a: #bbbbbb;
        --a-color: #2ec5f6;
        --highlighted: #80731e;
    }

    /* math */

    img.math {
        -webkit-filter: invert(100%);
        filter: invert(100%);
    }

    div.math img {
        -webkit-filter: invert(100%);
        filter: invert(100%);
    }

    div.highlight {
        -webkit-filter: invert(100%) hue-rotate(180deg);
        filter: invert(100%) hue-rotate(180deg);
    }

    code {
        -webkit-filter: invert(100%) hue-rotate(180deg);
        filter: invert(100%) hue-rotate(180deg);
    }

    code span.pre {
        -webkit-filter: hue-rotate(180deg);
        filter: hue-rotate(180deg);
    }
}

@media (prefers-color-scheme: no-preference) {
    :root {
        --bg-color: #ffffff;
        --fg-color: #000000;
        --nv-color: #333333;
        --hv-color: #eeeeee;
        --sb-color: #f7f5fa;
        --dt-color: #f3f3fb;
        --alert-info: #5bc0de;
        --admonition-a: #555555;
        --a-color: #008cba;
    }
}

body {
    color: var(--fg-color) !important;
    background-color: var(--bg-color) !important;
}


a.headerlink {
    visibility: hidden;
}

code.descclassname, code.descname {
    font-size: 110%;
}

/*
Left navbar
*/

#sidebar {
    border: solid 1px #cccccc;
    background-color: var(--sb-color);
}

.bs-sidenav {
    text-shadow: 0 1px 0 var(--bg-color);
}

.bs-sidenav .nav > li > a {
    color: var(--nv-color) !important;
}

nav > li > a:hover, .nav > li > a:focus {
    background-color: var(--hv-color) !important;
}

nav > li > a:hover, .nav > li > a:hover {
    background-color: var(--hv-color) !important;
}

div.col-md-3 {
    text-align: center;
}

div.col-md-3 p.caption {
    padding: 0;
    margin: 1ex 0 0.5ex 0;
}

p.toctitle {
    padding-left: 0;
    font-weight: bold;
    font-size: 150%;
    font-variant: small-caps;
}

p.caption {
    padding: 0 0 0 1em;
    margin: 1ex 0 0.5ex 0;
    font-weight: bold;
}

ul.globaltoc {
    font-size: 120%;
    padding: 0;
    margin: 0;
}

ul.simple p {
    margin-bottom: 0;
}

img.logo {
    margin: 1ex 0 1em 0;
    width: 150px;
    height: auto;
}


/*
Documentation functions
*/

a {
    color: var(--a-color);
    text-decoration: none;
}

table {
    font-size: 100%;
}

dl {
    margin: 0;
    padding: 0;
}

dl dd {
    margin-left: 30px;
}

dl.function, dl.class, dl.exception {
    padding-top: 0;
    clear: both;
    margin: 1em 0 1ex 0;
}

dl.function, dl.exception {
    border-top: 3px solid #cccccc;
    border-radius: 3px;
}

dl.class {
    border-top: 3px solid #729fcf;
    border-radius: 3px;
}

dl.function dt, dl.class dt, dl.exception dt {
    margin-bottom: 1ex;
    padding: 0.5ex 1ex 0.5ex 1ex;
    border-radius: 3px;
}

dl.function dt, dl.exception dt {
    background-color: var(--sb-color);
}

dl.class dt {
    background-color: var(--dt-color);
    border-radius: 3px;
}

dl.field-list dt, dl.simple dt {
    background-color: var(--bg-color);
}

dt.field-odd, dt.field-even {
    background-color: var(--bg-color);
}

table.longtable {
    font-size: 100%;
}

.admonition {
    font-size: 100%;
}

dl.citation dt.label {
    background-color: none;
    margin-right: 5px;
    color: var(--fg-color);
}

a.fn-backref {
    color: #000000;
}

table.citation {
    border-left: none;
    font-size: 100%;
}

table.citation td.label {
    font-size: 100%;
    display: block;
    line-height: normal;
    padding: none;
    vertical-align: baseline;
    border: none;
    color: #000000;
}

.citation td {
    width: 100%;
}

.admonition a {
    color: var(--admonition-a);
}

a.fn-backref {
    color: var(--fg-color);
}

dt:target, span.highlighted {
    background-color: var(--highlighted);
}

.alert-info {
    background-color: var(--alert-info) !important;
}

.form-control {
    background-color: var(--bg-color) !important;
}


/*
Sphinx gallery image size
*/

.sphx-glr-thumbcontainer {
    min-height: 330px !important;
    margin-bottom: 10px !important;
    background: var(--bg-color) !important;
    border-color: var(--admonition-a) !important;
}

.sphx-glr-thumbcontainer .figure {
    width: 320px !important;
}

.sphx-glr-thumbcontainer img {
    max-height: 300px !important;
    width: 300px !important;
    max-width: 300px !important;
}

.sphx-glr-thumbcontainer a.internal {
    padding: 310px 10px 0 !important;
}

div.sphx-glr-download a {
    background-color: var(--bg-color) !important;
    border-color: #aaaaaa !important;
    background-image: linear-gradient(to bottom, var(--bg-color), var(--sb-color)) !important;
}

div.sphx-glr-download a:hover {
    background-image: linear-gradient(to top, var(--sb-color), var(--sb-color)) !important;
}
diff --git a/doc/nngt_theme/theme.conf b/doc/nngt_theme/theme.conf
deleted file mode 100755
index 2056a7a..0000000
--- a/doc/nngt_theme/theme.conf
@@ -1,4 +0,0 @@
[theme]
inherit = bootstrap
stylesheet = nngt_theme.css
pygments_style = sphinx
diff --git a/doc/user/activity-analysis.rst b/doc/user/activity-analysis.rst
index 5ba84fd..71c1a9d 100755
--- a/doc/user/activity-analysis.rst
+++ b/doc/user/activity-analysis.rst
@@ -4,9 +4,6 @@
Activity analysis
=================

.. contents::
   :local:

Principle
=========

diff --git a/doc/user/component-properties.rst b/doc/user/component-properties.rst
index c353bbb..fd20fdd 100755
--- a/doc/user/component-properties.rst
+++ b/doc/user/component-properties.rst
@@ -7,11 +7,6 @@ Properties of graph components
This section details the different attributes and properties which can be
associated to nodes/neurons and connections in graphs and networks.

**Content:**

.. contents::
   :local:


Components of a graph
=====================
diff --git a/doc/user/graph-generation.rst b/doc/user/graph-generation.rst
index 41ce8bb..b683afe 100755
--- a/doc/user/graph-generation.rst
+++ b/doc/user/graph-generation.rst
@@ -12,12 +12,6 @@ The example files can be found at: :source:`docs/examples/simple_graphs.py`,
:source:`docs/examples/nest_receptor_ports.py`.


**Content:**

.. contents::
   :local:


Principle
=========

diff --git a/doc/user/nest-interaction.rst b/doc/user/nest-interaction.rst
index a66cf8c..e3c81e8 100644
--- a/doc/user/nest-interaction.rst
+++ b/doc/user/nest-interaction.rst
@@ -37,12 +37,6 @@ found here: :source:`docs/examples/nest_network.py` /
:source:`docs/examples/nest_receptor_ports.py`.


**Content:**

.. contents::
   :local:


Creating detailed neuronal networks
===================================

diff --git a/doc/user/neural-groups.rst b/doc/user/neural-groups.rst
index 4d2a2d4..a96fba4 100644
--- a/doc/user/neural-groups.rst
+++ b/doc/user/neural-groups.rst
@@ -13,11 +13,6 @@ additional information on how to access :class:`~nngt.NeuralGroup` and
:class:`~nngt.NeuralPop` properties can be found there:
:source:`docs/examples/introduction_to_groups.py`.

**Contents**

.. contents::
   :local:


Neuronal groups
===============
diff --git a/doc/user/parallelism.rst b/doc/user/parallelism.rst
index a17df12..3aeb489 100755
--- a/doc/user/parallelism.rst
+++ b/doc/user/parallelism.rst
@@ -8,9 +8,6 @@ Parallelism
  When using ``graph-tool``, read carefully the `Graph-tool caveat`_ section
  before playing with multiple threads!

.. contents::
   :local:


Principle
=========
diff --git a/doc/user/tutorial.rst b/doc/user/tutorial.rst
index 8556d9d..cd36131 100644
--- a/doc/user/tutorial.rst
+++ b/doc/user/tutorial.rst
@@ -35,12 +35,6 @@ The source file for the tutorial can be found here:
    * :ref:`graph-prop`


**Content:**

.. contents::
   :local:


NNGT properties and configuration
=================================

diff --git a/nngt/generation/func_connect.h b/nngt/generation/func_connect.h
index 35337be..e7731de 100644
--- a/nngt/generation/func_connect.h
+++ b/nngt/generation/func_connect.h
@@ -5,14 +5,14 @@
#ifndef FUNC_CONNECT_H
#define FUNC_CONNECT_H

#include <algorithm>
#include <cmath>
#include <functional>
#include <string>
#include <vector>
#include <tuple>
#include <unordered_set>

#include <cmath>
#include <algorithm>


namespace generation {

@@ -46,7 +46,7 @@ typedef std::unordered_set<edge_t, key_hash, key_equal> set_t;
 * Sort a vector to move the N unique numbers in the N first entries.
 *
 * \param a - Source array.
 * 
 *
 * .. note::
 *   The array is modified inplace.
 *
@@ -60,7 +60,7 @@ size_t _unique_1d(std::vector<size_t>& a,
 * Sort a 2-D vector to move the N unique pairs in the N first columns.
 *
 * \param a - Source array.
 * 
 *
 * .. note::
 *   The array is modified inplace.
 *
@@ -119,7 +119,7 @@ void _gen_edges(

/*
 * Parallel distance-rule generator.
 * 
 *
 * \param ia_edges       - array that will contain the edges
 * \param source_nodes   - array containing the ids of the source nodes
 * \param target_nodes   - array containing the ids of the target nodes
@@ -151,7 +151,7 @@ static inline float _proba(
{
    float p = 0.;  // probability value

    switch (rule) 
    switch (rule)
    {
        case 0:  // linear
            p = norm*std::max(0., 1. - distance * inv_scale);
diff --git a/nngt/plot/plt_networks.py b/nngt/plot/plt_networks.py
index 7b4dd47..a7bb391 100755
--- a/nngt/plot/plt_networks.py
+++ b/nngt/plot/plt_networks.py
@@ -1531,7 +1531,7 @@ def library_draw(network, nsize="total-degree", ncolor=None, nshape="o",
def chord_diagram(network, weights=True, names=None, order=None, width=0.1,
                  pad=2., gap=0.03, chordwidth=0.7, axis=None, colors=None,
                  cmap=None, alpha=0.7, use_gradient=False, chord_colors=None,
                  show=False, **kwargs):
                  start_at=0, extent=360, directed=None, show=False, **kwargs):
    """
    Plot a chord diagram.

@@ -1579,6 +1579,17 @@ def chord_diagram(network, weights=True, names=None, order=None, width=0.1,
          (in this case, RGB tuples are accepted as entries to the list).
          Each chord will get its color from its associated source node, or
          from both nodes if `use_gradient` is True.
    start_at : float, optional (default : 0)
        Location, in degrees, where the diagram should start on the unit circle.
        Default is to start at 0 degrees, i.e. (x, y) = (1, 0) or 3 o'clock),
        and move counter-clockwise
    extent : float, optional (default : 360)
        The angular aperture, in degrees, of the diagram.
        Default is to use the whole circle, i.e. 360 degrees, but in some cases
        it can be useful to use only a part of it.
    directed : bool, optional (default: same as network)
        Whether the chords should be directed with one part of each arc
        dedicated to outgoing chords and the other to incoming ones.
    show : bool, optional (default: False)
        Whether the plot should be displayed immediately via an automatic call
        to `plt.show()`.
@@ -1600,11 +1611,14 @@ def chord_diagram(network, weights=True, names=None, order=None, width=0.1,

    mat = network.adjacency_matrix(weights=ww)

    if directed is None:
        directed = network.is_directed()

    return _chord_diag(
        mat, nn, order=order, width=width, pad=pad, gap=gap,
        chordwidth=chordwidth, ax=axis, colors=colors, cmap=cmap, alpha=alpha,
        use_gradient=use_gradient, chord_colors=chord_colors, show=show,
        **kwargs)
        use_gradient=use_gradient, chord_colors=chord_colors, start_at=start_at,
        extent=extent, directed=directed, show=show, **kwargs)


# ----- #
-- 
2.34.4
NNGT/patches/.build.yml: SUCCESS in 25m17s

[Doc+Plot: move to Furo + directed chord diagram][0] from [~tfardet][1]

[0]: https://lists.sr.ht/~tfardet/nngt-developers/patches/35652
[1]: mailto:tanguyfardet@protonmail.com

✓ #852097 SUCCESS NNGT/patches/.build.yml https://builds.sr.ht/~tfardet/job/852097