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.
An example can be found in file example.py
.
Here is what the diagrams look like:
- Upper left > no gradient, no gap, default colormap, default order
- Upper right > directed, no gap, "summer" colormap, rotated names, sorted by distance
- Lower left > no gradient but gap, single color for chords, rotated names, sorted by distance
- Lower right > gradient and gap, default colormap, sorted by size
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)
================ ================== ==================================
"""
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
- 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:
- Do not plot chords that have zero in and out weights gph82 (PR #14/17)
See the Python Graph Gallery's chord diagram entry for alternative libraries.