Skip to content

himanshuRepo/chord

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Example Image

Introduction

In a chord diagram (or radial network), entities are arranged radially as segments with their relationships visualised by arcs that connect them. The size of the segments illustrates the numerical proportions, whilst the size of the arc illustrates the significance of the relationships1.

Chord diagrams are useful when trying to convey relationships between different entities, and they can be beautiful and eye-catching.

The Chord Package

I wanted to do a section on Chord Diagrams for my book, Data Is Beautiful.

With Python in mind, there are many libraries available for creating Chord diagrams, such as Plotly, Bokeh, and a few that are lesser-known. However, I wanted to use the implementation from d3 because it can be customised to be highly interactive and to look beautiful.

I couldn't find anything that ticked all the boxes, so I made a wrapper around d3-chord myself. It took some time to get it working, but I wanted to hide away everything behind a single constructor and method call. The tricky part was enabling multiple chord diagrams on the same page, and then loading resources in a way that would support Jupyter Lab.

The primary support is for Jupyter Lab (not the older Jupyter Notebook).

Installation

Available on https://pypi.org/chord through pip:

pip install chord

Examples

You can see the actual interactive examples on this page. The below examples are screenshots.

The Dataset

The focus for this section will be the demonstration of the chord package. To keep it simple, we will use synthetic data that illustrates the co-occurrences between movie genres within the same movie.

matrix = [
    [0, 5, 6, 4, 7, 4],
    [5, 0, 5, 4, 6, 5],
    [6, 5, 0, 4, 5, 5],
    [4, 4, 4, 0, 5, 5],
    [7, 6, 5, 5, 0, 4],
    [4, 5, 5, 5, 4, 0],
]

names = ["Action", "Adventure", "Comedy", "Drama", "Fantasy", "Thriller"]

Default Settings

Let's see what the Chord() defaults produce when we invoke the show() method.

Chord(matrix, names).show()

Example Image

You can also save it to a HTML file.

Chord(matrix, names).to_html()

Different Colours

The defaults are nice, but what if we want different colours? You can pass in almost anything from d3-scale-chromatic, or you could pass in a list of hexadecimal colour codes.

Chord(matrix, names, colors="d3.schemeSet2").show()

Example Image

Chord(matrix, names, colors=f"d3.schemeGnBu[{len(names)}]").show()

Example Image

Chord(matrix, names, colors="d3.schemeSet3").show()

Example Image

Chord(matrix, names, colors=f"d3.schemePuRd[{len(names)}]").show()

Example Image

Chord(matrix, names, colors=f"d3.schemeYlGnBu[{len(names)}]").show()

Example Image

hex_colours = ["#222222", "#333333", "#4c4c4c", "#666666", "#848484", "#9a9a9a"]

Chord(matrix, names, colors=hex_colours).show()

Example Image

Label Styling

We can disable the wrapped labels, and even change the colour.

Chord(matrix, names, wrap_labels=False, label_color="#4c40bf").show()

Example Image

Opacity

We can also change the default opacity of the relationships.

Chord(matrix, names, opacity=0.1).show()

Example Image

Diagram Size

We can change the maximum diagram size by specifying a width.

Chord(matrix, names, width=400).show()

We can change the padding between chord segments by specifying the padding.

Chord(matrix, names, padding=0.3).show()

  1. Tintarev, N., Rostami, S., & Smyth, B. (2018, April). Knowing the unknown: visualising consumption blind-spots in recommender systems. In Proceedings of the 33rd Annual ACM Symposium on Applied Computing (pp. 1396-1399). 

Credits

  • d3-chord, Mike Bostock.
  • d3-chord gradient fills, Nadieh Bremer.
  • chord (Python), Shahin Rostami.

Example Image


About

Python wrapper around d3-chord. Full examples at https://shahinrostami.com/posts/statistics/data-is-beautiful/chord-diagrams

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages

  • Python 100.0%