Skip to main content

Creating Sankey flow diagrams in Matplotlib

Project description

SankeyFlow

SankeyFlow is a lightweight python package that plots Sankey flow diagrams using Matplotlib.

sankey example

from sankeyflow import Sankey

nodes = [
    [('Product', 20779), ('Sevice and other', 30949)],
    [('Total revenue', 51728)],
    ...
]
flows = [
    ('Product', 'Total revenue', 20779),
    ('Sevice and other', 'Total revenue', 30949),
    ...
]
s = Sankey(flows=flows, nodes=nodes)
s.draw()
plt.show()

See example/msft_FY22q2.py for full example.

Description

While MPL does have a builtin sankey class, it is only capable of a single node. SankeyFlow allows for any number of nodes and flows between them. It also treats nodes and flows separately, so the node value, inflows, and outflows don't have to be equal. However, automatic node inference is also available (TODO).

cutflow example

SankeyFlow is also fully transparent with Matplotlib; the sankey diagram requires only an axis to be drawn: Sankey.draw(ax). All elements in the diagram are Matplotlib primitives (Patch and Text), and can be directly modified with the full suite of Matplotlib options.

Installation

Requires Matplotlib and numpy.

python3 -m pip install sankeyflow

You can then simpliy

from sankeyflow import Sankey

Usage

The core class is sankeyflow.Sankey, which builds and draws the diagram. Data is passed in the constructor or with Sankey.sankey(flows, nodes), and the diagram is drawn with Sankey.draw(ax).

The diagram defaults to a left-to-right flow pattern, and breaks the nodes into "levels," which correspond to the x position. The cutflow diagram above has 5 levels, for example.

  • nodes is a nested list of length nlevels, ordered from left to right. For each level, there is a list of nodes ordered from top to bottom. Each node is a (name, value) pair.
  • flows is a list of flows, coded as (source, destination, value). source and destination should match the names in nodes.

If nodes is None, the nodes will be automatically inferred and placed from the flows (TODO).

nodes = [
    [('A', 10)],
    [('B1', 4), ('B2', 5)],
    [('C', 3)]
]
flows = [
    ('A', 'B1', 4),
    ('A', 'B2', 5),
    ('B1', 'C', 1),
    ('B2', 'C', 2),
] 

plt.figure(figsize=(4, 3), dpi=144)
s = Sankey(flows=flows, nodes=nodes)
s.draw()

example 1

Configuration

Diagram and global configuration are set in the constructor. Individual nodes and flows can be further modified by adding a dictionary containing configuration arguments to the input tuples in Sankey.sankey(). See docstrings for complete argument lists.

For example, we can change the colormap to pastel, make all flows not curvy, and change the color of one flow.

flows = [
    ('A', 'B1', 4),
    ('A', 'B2', 5),
    ('B1', 'C', 1),
    ('B2', 'C', 2, {'color': 'red'}),
] 

s = Sankey(
    flows=flows,
    nodes=nodes,
    cmap=plt.cm.Pastel1,
    flow_opts=dict(curvature=0),
)
s.draw()

example 2

By default the color of the flows is the color of the destination node. This can be altered globally or per-flow with flow_color_mode.

flows = [
    ('A', 'B1', 4),
    ('A', 'B2', 5, {'flow_color_mode': 'dest'}),
    ('B1', 'C', 1),
    ('B2', 'C', 2),
] 

s = Sankey(
    flows=flows,
    nodes=nodes,
    flow_color_mode='source',
)
s.draw()

example 3

We can also easily adjust the label formatting and other node properties in the same way.

nodes = [
    [('A', 10)],
    [('B1', 4), ('B2', 5)],
    [('C', 3, {'label_pos':'top'})]
]
flows = [
    ('A', 'B1', 4),
    ('A', 'B2', 5),
    ('B1', 'C', 1),
    ('B2', 'C', 2),
] 

s = Sankey(
    flows=flows,
    nodes=nodes,
    node_opts=dict(label_format='{label} ${value:.2f}'),
)
s.draw()

example 4

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sankeyflow-0.1.1.tar.gz (19.1 kB view details)

Uploaded Source

Built Distribution

sankeyflow-0.1.1-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

Details for the file sankeyflow-0.1.1.tar.gz.

File metadata

  • Download URL: sankeyflow-0.1.1.tar.gz
  • Upload date:
  • Size: 19.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.26.0 requests-toolbelt/0.9.1 urllib3/1.26.6 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.6

File hashes

Hashes for sankeyflow-0.1.1.tar.gz
Algorithm Hash digest
SHA256 c1c6d6f4bc2d9d925a5a0d10b6f59d7ccab2cf43bbe706cbac2c1b504c8cb57b
MD5 31a1bdfcb91861d05f5ea7a93979987a
BLAKE2b-256 52cfec28de76d5d0de34eb3c67fae31ca3fb840700c28b77a71aae241a4c4f72

See more details on using hashes here.

File details

Details for the file sankeyflow-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: sankeyflow-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.26.0 requests-toolbelt/0.9.1 urllib3/1.26.6 tqdm/4.62.3 importlib-metadata/4.11.1 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.6

File hashes

Hashes for sankeyflow-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6614c3edb3ccb813b7c50b78e9a6d4a894085dfa8b7e34fade09323c0ae0409c
MD5 50a12f93a0d7207fcca0156de75eeb31
BLAKE2b-256 1e6bbef33152484af6d425fc17a05ad73e88165ac4e30f1121701d61fe441cbf

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page