Plot chord diagrams with matplotlib.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Tanguy Fardet f40c3bf4d7 Maintenance: stop using deprecated get_cmap (#43) 4 hours ago
images Support directed chords (#38) 4 months ago
.gitignore Make package for pypi (#12) 2 years ago
LICENSE Add gradient feature (#5) 2 years ago
MANIFEST.in Make package for pypi (#12) 2 years ago
README.md Add Zenodo DOI and correct image descriptions (#41) 4 months ago
__init__.py Fix setup.py and move to codeberg (#24) 1 year ago
_info.py Version 0.4.0 (#40) 4 months ago
chord_diagram.py Maintenance: stop using deprecated get_cmap (#43) 4 hours ago
example.py Support directed chords (#38) 4 months ago
gradient.py Added chord sorting, improved gradient, and adaptive curvature (#7) 2 years ago
requirements.txt Move to python module (#9) 2 years ago
setup.cfg [setup.py] Fix install as pip package (#28) 1 year ago
setup.py [setup.py] Fix Pypi install (#29) 1 year ago
utilities.py Support directed chords (#38) 4 months ago

README.md

mpl_chord_diagram

License PyPI DOI

Python module to plot chord diagrams with matplotlib.

The code is hosted on Codeberg's Gitea and mirrored on GitHub. Please raise any issue you encouter on the issue tracker.

Note that the repository has this structure (everything is on root level) to be able to be used more easily as a git submodule.

Example

An example can be found in file example.py. Here is what the diagrams look like:

  • Upper left > no gradient, no gap, default colormap, chords sorted by distance
  • Upper right > directed chords, no gap, "summer" colormap, rotated names, chords sorted by distance
  • Lower left > gap, single color for chords, rotated names, unsorted chords
  • Lower right > gradient and gap, default colormap, chords sorted by size

Chord diagram without gradient, chords sorted by distanceChord diagram with directed chords and rotated names, chords sorted by distance

Chord diagram without grey chords in unsorted orderChord diagram with gradient, sorted by size

Main plot function

def chord_diagram(mat, names=None, order=None, width=0.1, pad=2., gap=0.03,
                  chordwidth=0.7, ax=None, colors=None, cmap=None, alpha=0.7,
                  use_gradient=False, chord_colors=None, start_at=0, extent=360,
                  directed=False, show=False, **kwargs):
    """
    Plot a chord diagram.

    Draws a representation of many-to-many interactions between elements, given
    by an interaction matrix.
    The elements are represented by arcs proportional to their degree and the
    interactions (or fluxes) are drawn as chords joining two arcs:

    * for undirected chords, the size of the arc is proportional to its
      out-degree (or simply its degree if the matrix is fully symmetrical), i.e.
      the sum of the element's row.
    * for directed chords, the size is proportional to the total-degree, i.e.
      the sum of the element's row and column.

    Parameters
    ----------
    mat : square matrix
        Flux data, ``mat[i, j]`` is the flux from i to j.
    names : list of str, optional (default: no names)
        Names of the nodes that will be displayed (must be ordered as the
        matrix entries).
    order : list, optional (default: order of the matrix entries)
        Order in which the arcs should be placed around the trigonometric
        circle.
    width : float, optional (default: 0.1)
        Width/thickness of the ideogram arc.
    pad : float, optional (default: 2)
        Distance between two neighboring ideogram arcs. Unit: degree.
    gap : float, optional (default: 0)
        Distance between the arc and the beginning of the cord.
    chordwidth : float, optional (default: 0.7)
        Position of the control points for the chords, controlling their shape.
    ax : matplotlib axis, optional (default: new axis)
        Matplotlib axis where the plot should be drawn.
    colors : list, optional (default: from `cmap`)
        List of user defined colors or floats.
    cmap : str or colormap object (default: viridis)
        Colormap that will be used to color the arcs and chords by default.
        See `chord_colors` to use different colors for chords.
    alpha : float in [0, 1], optional (default: 0.7)
        Opacity of the chord diagram.
    use_gradient : bool, optional (default: False)
        Whether a gradient should be use so that chord extremities have the
        same color as the arc they belong to.
    chord_colors : str, or list of colors, optional (default: None)
        Specify color(s) to fill the chords differently from the arcs.
        When the keyword is not used, chord colors default to the colomap given
        by `colors`.
        Possible values for `chord_colors` are:

        * a single color (do not use an RGB tuple, use hex format instead),
          e.g. "red" or "#ff0000"; all chords will have this color
        * a list of colors, e.g. ``["red", "green", "blue"]``, one per node
          (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: False)
        Whether the chords should be directed, like edges in a graph, 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()`.
    **kwargs : keyword arguments
        Available kwargs are:

        ================  ==================  ==================================
              Name               Type            Purpose and possible values
        ================  ==================  ==================================
        fontcolor         str or list         Color of the names (default: "k")
        ----------------  ------------------  ----------------------------------
        fontsize          int                 Size of the font for names
        ----------------  ------------------  ----------------------------------
        rotate_names      (list of) bool(s)   Rotate names by 90°
        ----------------  ------------------  ----------------------------------
        sort              str                 Either None, "size", or "distance"
                                              (default is "size")
        ----------------  ------------------  ----------------------------------
                                              Minimal chord width to replace
        min_chord_width   float               small entries and zero reciprocals
                                              in the matrix (default: 0)
        ================  ==================  ==================================
    """

Usage and requirements

Install using

pip install mpl-chord-diagram

then, in python script or terminal:

from mpl_chord_diagram import chord_diagram

The code requires numpy, scipy and matplotlib, which should be installed automatically. If necessary, you can also install them by calling

pip install -r requirements.txt

Contributors

  • Original author: @fengwangPhysics
  • Refactoring (Tanguy Fardet, PRs #6, #9 & #12)
  • Support sparse matrices: Tanguy Fardet (PR #10)
  • Improved color support (colormaps, gradients, chord colors):
  • Improved arcs and chords:
    • @cy1110 (PR #2)
    • Tanguy Fardet (PRs #6 for gap addition and #7 for adaptive curvature and sorting)
  • Do not plot chords that have zero in and out weights gph82 (PR #14/17)

Alternative solutions in Python

See the Python Graph Gallery's chord diagram entry for alternative libraries.