Nodes and labels are getting overlapped in Holoviews Chord plot

Hi everyone,

few nodes and associated labels are getting overlapped when I am creating a Holoviews Chord plot using a custom json dataset.


I have tried customize the inbuilt option padding, responsive, height but with no luck. Someone please help me resolving this.

My code for building this Chord:

edge_data = [{"from": "Maulana Saheb", "to": "Lady Anna", "value": 1}, {"from": "Maulana Saheb", "to": "Mahadev", "value": 1}, {"from": "Maulana Saheb", "to": "Netaji", "value": 1}, {"from": "Maulana Saheb", "to": "Gurudev", "value": 1}, {"from": "Maulana Saheb", "to": "George Washington", "value": 1}, {"from": "Maulana Saheb", "to": "Linlithgow", "value": 1}, {"from": "Maulana Saheb", "to": "Quaid", "value": 1}, {"from": "Maulana Saheb", "to": "Herr Hitler", "value": 1}, {"from": "Maulana Saheb", "to": "Ranade", "value": 1}, {"from": "Maulana Saheb", "to": "Frank Johnson", "value": 1}, {"from": "Maulana Saheb", "to": "Dadabhai", "value": 1}, {"from": "Maulana Saheb", "to": "Jinnah Saheb", "value": 1}, {"from": "Maulana Saheb", "to": "Pherozeshah", "value": 1}, {"from": "Maulana Saheb", "to": "Pearson", "value": 1}, {"from": "Maulana Saheb", "to": "Gokhale", "value": 1}, {"from": "Maulana Saheb", "to": "Rajaji", "value": 1}, {"from": "Maulana Saheb", "to": "Charlie Andrews", "value": 1}, {"from": "Maulana Saheb", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Maulana Saheb", "to": "Shri Savarkar", "value": 1}, {"from": "Maulana Saheb", "to": "Shek", "value": 1}, {"from": "Maulana Saheb", "to": "De Valera", "value": 1}, {"from": "Maulana Saheb", "to": "Jawaharlal", "value": 1}, {"from": "Borah", "to": "John Nevin Sayre", "value": 1}, {"from": "Mahadev", "to": "Lady Anna", "value": 1}, {"from": "Mahadev", "to": "Netaji", "value": 1}, {"from": "Mahadev", "to": "Gurudev", "value": 1}, {"from": "Mahadev", "to": "George Washington", "value": 1}, {"from": "Mahadev", "to": "Linlithgow", "value": 1}, {"from": "Mahadev", "to": "Quaid", "value": 1}, {"from": "Mahadev", "to": "Herr Hitler", "value": 1}, {"from": "Mahadev", "to": "Ranade", "value": 1}, {"from": "Mahadev", "to": "Frank Johnson", "value": 1}, {"from": "Mahadev", "to": "Dadabhai", "value": 1}, {"from": "Mahadev", "to": "Jinnah Saheb", "value": 1}, {"from": "Mahadev", "to": "Pherozeshah", "value": 1}, {"from": "Mahadev", "to": "Pearson", "value": 1}, {"from": "Mahadev", "to": "Gokhale", "value": 1}, {"from": "Mahadev", "to": "Rajaji", "value": 1}, {"from": "Mahadev", "to": "Charlie Andrews", "value": 1}, {"from": "Mahadev", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Mahadev", "to": "Shri Savarkar", "value": 1}, {"from": "Mahadev", "to": "Shek", "value": 1}, {"from": "Mahadev", "to": "De Valera", "value": 1}, {"from": "Mahadev", "to": "Jawaharlal", "value": 1}, {"from": "Netaji", "to": "Lady Anna", "value": 1}, {"from": "Netaji", "to": "Gurudev", "value": 1}, {"from": "Netaji", "to": "George Washington", "value": 1}, {"from": "Netaji", "to": "Linlithgow", "value": 1}, {"from": "Netaji", "to": "Quaid", "value": 1}, {"from": "Netaji", "to": "Herr Hitler", "value": 1}, {"from": "Netaji", "to": "Ranade", "value": 1}, {"from": "Netaji", "to": "Frank Johnson", "value": 1}, {"from": "Netaji", "to": "Dadabhai", "value": 1}, {"from": "Netaji", "to": "Jinnah Saheb", "value": 1}, {"from": "Netaji", "to": "Pherozeshah", "value": 1}, {"from": "Netaji", "to": "Pearson", "value": 1}, {"from": "Netaji", "to": "Gokhale", "value": 1}, {"from": "Netaji", "to": "Rajaji", "value": 1}, {"from": "Netaji", "to": "Charlie Andrews", "value": 1}, {"from": "Netaji", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Netaji", "to": "Shri Savarkar", "value": 1}, {"from": "Netaji", "to": "Shek", "value": 1}, {"from": "Netaji", "to": "De Valera", "value": 1}, {"from": "Netaji", "to": "Jawaharlal", "value": 1}, {"from": "Gurudev", "to": "Lady Anna", "value": 1}, {"from": "Gurudev", "to": "George Washington", "value": 1}, {"from": "Gurudev", "to": "Linlithgow", "value": 1}, {"from": "Gurudev", "to": "Quaid", "value": 1}, {"from": "Gurudev", "to": "Herr Hitler", "value": 1}, {"from": "Gurudev", "to": "Ranade", "value": 1}, {"from": "Gurudev", "to": "Frank Johnson", "value": 1}, {"from": "Gurudev", "to": "Dadabhai", "value": 1}, {"from": "Gurudev", "to": "Jinnah Saheb", "value": 1}, {"from": "Gurudev", "to": "Pherozeshah", "value": 1}, {"from": "Gurudev", "to": "Pearson", "value": 1}, {"from": "Gurudev", "to": "Gokhale", "value": 1}, {"from": "Gurudev", "to": "Rajaji", "value": 1}, {"from": "Gurudev", "to": "Charlie Andrews", "value": 1}, {"from": "Gurudev", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Gurudev", "to": "Shri Savarkar", "value": 1}, {"from": "Gurudev", "to": "Shek", "value": 1}, {"from": "Gurudev", "to": "De Valera", "value": 1}, {"from": "Gurudev", "to": "Jawaharlal", "value": 1}, {"from": "George Washington", "to": "Lady Anna", "value": 1}, {"from": "George Washington", "to": "Linlithgow", "value": 1}, {"from": "George Washington", "to": "Quaid", "value": 1}, {"from": "George Washington", "to": "Herr Hitler", "value": 1}, {"from": "George Washington", "to": "Tobias", "value": 1}, {"from": "George Washington", "to": "Ranade", "value": 1}, {"from": "George Washington", "to": "Frank Johnson", "value": 1}, {"from": "George Washington", "to": "Dadabhai", "value": 1}, {"from": "George Washington", "to": "Jinnah Saheb", "value": 1}, {"from": "George Washington", "to": "Pherozeshah", "value": 1}, {"from": "George Washington", "to": "Pearson", "value": 1}, {"from": "George Washington", "to": "Gokhale", "value": 1}, {"from": "George Washington", "to": "Rajaji", "value": 1}, {"from": "George Washington", "to": "Charlie Andrews", "value": 1}, {"from": "George Washington", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "George Washington", "to": "Shri Savarkar", "value": 1}, {"from": "George Washington", "to": "Shek", "value": 1}, {"from": "George Washington", "to": "De Valera", "value": 1}, {"from": "George Washington", "to": "Jawaharlal", "value": 1}, {"from": "Linlithgow", "to": "Lady Anna", "value": 1}, {"from": "Linlithgow", "to": "Quaid", "value": 1}, {"from": "Linlithgow", "to": "Herr Hitler", "value": 1}, {"from": "Linlithgow", "to": "Ranade", "value": 1}, {"from": "Linlithgow", "to": "Frank Johnson", "value": 1}, {"from": "Linlithgow", "to": "Dadabhai", "value": 1}, {"from": "Linlithgow", "to": "Jinnah Saheb", "value": 1}, {"from": "Linlithgow", "to": "Pherozeshah", "value": 1}, {"from": "Linlithgow", "to": "Pearson", "value": 1}, {"from": "Linlithgow", "to": "Gokhale", "value": 1}, {"from": "Linlithgow", "to": "Rajaji", "value": 1}, {"from": "Linlithgow", "to": "Charlie Andrews", "value": 1}, {"from": "Linlithgow", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Linlithgow", "to": "Shri Savarkar", "value": 1}, {"from": "Linlithgow", "to": "Shek", "value": 1}, {"from": "Linlithgow", "to": "De Valera", "value": 1}, {"from": "Linlithgow", "to": "Jawaharlal", "value": 1}, {"from": "Lady Anna", "to": "Jawaharlal", "value": 1}, {"from": "Lady Anna", "to": "Herr Hitler", "value": 1}, {"from": "Lady Anna", "to": "Ranade", "value": 1}, {"from": "Lady Anna", "to": "Frank Johnson", "value": 1}, {"from": "Lady Anna", "to": "Dadabhai", "value": 1}, {"from": "Lady Anna", "to": "Jinnah Saheb", "value": 1}, {"from": "Lady Anna", "to": "Pherozeshah", "value": 1}, {"from": "Lady Anna", "to": "Pearson", "value": 1}, {"from": "Lady Anna", "to": "Gokhale", "value": 1}, {"from": "Lady Anna", "to": "Rajaji", "value": 1}, {"from": "Lady Anna", "to": "Charlie Andrews", "value": 1}, {"from": "Lady Anna", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Lady Anna", "to": "Shri Savarkar", "value": 1}, {"from": "Lady Anna", "to": "Shek", "value": 1}, {"from": "Lady Anna", "to": "De Valera", "value": 1}, {"from": "Lady Anna", "to": "Quaid", "value": 1}, {"from": "Quaid", "to": "Herr Hitler", "value": 1}, {"from": "Quaid", "to": "Ranade", "value": 1}, {"from": "Quaid", "to": "Frank Johnson", "value": 1}, {"from": "Quaid", "to": "Dadabhai", "value": 1}, {"from": "Quaid", "to": "Jinnah Saheb", "value": 1}, {"from": "Quaid", "to": "Pherozeshah", "value": 1}, {"from": "Quaid", "to": "Pearson", "value": 1}, {"from": "Quaid", "to": "Gokhale", "value": 1}, {"from": "Quaid", "to": "Rajaji", "value": 1}, {"from": "Quaid", "to": "Charlie Andrews", "value": 1}, {"from": "Quaid", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Quaid", "to": "Shri Savarkar", "value": 1}, {"from": "Quaid", "to": "Shek", "value": 1}, {"from": "Quaid", "to": "De Valera", "value": 1}, {"from": "Quaid", "to": "Jawaharlal", "value": 1}, {"from": "Herr Hitler", "to": "Jawaharlal", "value": 1}, {"from": "Herr Hitler", "to": "Ranade", "value": 1}, {"from": "Herr Hitler", "to": "Frank Johnson", "value": 1}, {"from": "Herr Hitler", "to": "Dadabhai", "value": 1}, {"from": "Herr Hitler", "to": "Jinnah Saheb", "value": 1}, {"from": "Herr Hitler", "to": "Pherozeshah", "value": 1}, {"from": "Herr Hitler", "to": "Pearson", "value": 1}, {"from": "Herr Hitler", "to": "Gokhale", "value": 1}, {"from": "Herr Hitler", "to": "Rajaji", "value": 1}, {"from": "Herr Hitler", "to": "Charlie Andrews", "value": 1}, {"from": "Herr Hitler", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Herr Hitler", "to": "Shri Savarkar", "value": 1}, {"from": "Herr Hitler", "to": "Shek", "value": 1}, {"from": "Herr Hitler", "to": "De Valera", "value": 1}, {"from": "Tobias", "to": "De Valera", "value": 1}, {"from": "Ranade", "to": "Jawaharlal", "value": 1}, {"from": "Ranade", "to": "Frank Johnson", "value": 1}, {"from": "Ranade", "to": "Dadabhai", "value": 1}, {"from": "Ranade", "to": "Jinnah Saheb", "value": 1}, {"from": "Ranade", "to": "Pherozeshah", "value": 1}, {"from": "Ranade", "to": "Pearson", "value": 1}, {"from": "Ranade", "to": "Gokhale", "value": 1}, {"from": "Ranade", "to": "Rajaji", "value": 1}, {"from": "Ranade", "to": "Charlie Andrews", "value": 1}, {"from": "Ranade", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Ranade", "to": "Shri Savarkar", "value": 1}, {"from": "Ranade", "to": "Shek", "value": 1}, {"from": "Ranade", "to": "De Valera", "value": 1}, {"from": "Frank Johnson", "to": "Jawaharlal", "value": 1}, {"from": "Frank Johnson", "to": "Dadabhai", "value": 1}, {"from": "Frank Johnson", "to": "Jinnah Saheb", "value": 1}, {"from": "Frank Johnson", "to": "Pherozeshah", "value": 1}, {"from": "Frank Johnson", "to": "Pearson", "value": 1}, {"from": "Frank Johnson", "to": "Gokhale", "value": 1}, {"from": "Frank Johnson", "to": "Rajaji", "value": 1}, {"from": "Frank Johnson", "to": "Charlie Andrews", "value": 1}, {"from": "Frank Johnson", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Frank Johnson", "to": "Shri Savarkar", "value": 1}, {"from": "Frank Johnson", "to": "Shek", "value": 1}, {"from": "Frank Johnson", "to": "De Valera", "value": 1}, {"from": "Dadabhai", "to": "Jawaharlal", "value": 1}, {"from": "Dadabhai", "to": "Jinnah Saheb", "value": 1}, {"from": "Dadabhai", "to": "Pherozeshah", "value": 1}, {"from": "Dadabhai", "to": "Pearson", "value": 1}, {"from": "Dadabhai", "to": "Gokhale", "value": 1}, {"from": "Dadabhai", "to": "Rajaji", "value": 1}, {"from": "Dadabhai", "to": "Charlie Andrews", "value": 1}, {"from": "Dadabhai", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Dadabhai", "to": "Shri Savarkar", "value": 1}, {"from": "Dadabhai", "to": "Shek", "value": 1}, {"from": "Dadabhai", "to": "De Valera", "value": 1}, {"from": "Jinnah Saheb", "to": "Jawaharlal", "value": 1}, {"from": "Jinnah Saheb", "to": "Pherozeshah", "value": 1}, {"from": "Jinnah Saheb", "to": "Pearson", "value": 1}, {"from": "Jinnah Saheb", "to": "Gokhale", "value": 1}, {"from": "Jinnah Saheb", "to": "Rajaji", "value": 1}, {"from": "Jinnah Saheb", "to": "Charlie Andrews", "value": 1}, {"from": "Jinnah Saheb", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Jinnah Saheb", "to": "Shri Savarkar", "value": 1}, {"from": "Jinnah Saheb", "to": "Shek", "value": 1}, {"from": "Jinnah Saheb", "to": "De Valera", "value": 1}, {"from": "Pherozeshah", "to": "Jawaharlal", "value": 1}, {"from": "Pherozeshah", "to": "Pearson", "value": 1}, {"from": "Pherozeshah", "to": "Gokhale", "value": 1}, {"from": "Pherozeshah", "to": "Rajaji", "value": 1}, {"from": "Pherozeshah", "to": "Charlie Andrews", "value": 1}, {"from": "Pherozeshah", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Pherozeshah", "to": "Shri Savarkar", "value": 1}, {"from": "Pherozeshah", "to": "Shek", "value": 1}, {"from": "Pherozeshah", "to": "De Valera", "value": 1}, {"from": "Pearson", "to": "Jawaharlal", "value": 1}, {"from": "Pearson", "to": "Gokhale", "value": 1}, {"from": "Pearson", "to": "Rajaji", "value": 1}, {"from": "Pearson", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Pearson", "to": "Charlie Andrews", "value": 1}, {"from": "Pearson", "to": "Shri Savarkar", "value": 1}, {"from": "Pearson", "to": "Shek", "value": 1}, {"from": "Pearson", "to": "De Valera", "value": 1}, {"from": "Pierre Ceresole", "to": "Henry Eaton", "value": 1}, {"from": "Gokhale", "to": "Jawaharlal", "value": 1}, {"from": "Gokhale", "to": "Rajaji", "value": 1}, {"from": "Gokhale", "to": "Charlie Andrews", "value": 1}, {"from": "Gokhale", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Gokhale", "to": "Shri Savarkar", "value": 1}, {"from": "Gokhale", "to": "Shek", "value": 1}, {"from": "Gokhale", "to": "De Valera", "value": 1}, {"from": "Rajaji", "to": "Jawaharlal", "value": 1}, {"from": "Rajaji", "to": "Charlie Andrews", "value": 1}, {"from": "Rajaji", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Rajaji", "to": "Shri Savarkar", "value": 1}, {"from": "Rajaji", "to": "Shek", "value": 1}, {"from": "Rajaji", "to": "De Valera", "value": 1}, {"from": "Charlie Andrews", "to": "Sardar Vallabhbhai", "value": 1}, {"from": "Charlie Andrews", "to": "Shri Savarkar", "value": 1}, {"from": "Charlie Andrews", "to": "Shek", "value": 1}, {"from": "Charlie Andrews", "to": "De Valera", "value": 1}, {"from": "Charlie Andrews", "to": "Jawaharlal", "value": 1}, {"from": "Sardar Vallabhbhai", "to": "Jawaharlal", "value": 1}, {"from": "Sardar Vallabhbhai", "to": "Shri Savarkar", "value": 1}, {"from": "Sardar Vallabhbhai", "to": "Shek", "value": 1}, {"from": "Sardar Vallabhbhai", "to": "De Valera", "value": 1}, {"from": "Shri Savarkar", "to": "Jawaharlal", "value": 1}, {"from": "Shri Savarkar", "to": "Shek", "value": 1}, {"from": "Shri Savarkar", "to": "De Valera", "value": 1}, {"from": "Shek", "to": "Jawaharlal", "value": 1}, {"from": "Shek", "to": "De Valera", "value": 1}, {"from": "De Valera", "to": "Jawaharlal", "value": 1}]
community_data = [{"person": "Maulana Saheb", "community": "0"}, {"person": "Borah", "community": "1"}, {"person": "Mahadev", "community": "0"}, {"person": "Netaji", "community": "0"}, {"person": "Gurudev", "community": "0"}, {"person": "George Washington", "community": "2"}, {"person": "Linlithgow", "community": "0"}, {"person": "Lady Anna", "community": "0"}, {"person": "Quaid", "community": "0"}, {"person": "Herr Hitler", "community": "0"}, {"person": "Tobias", "community": "2"}, {"person": "Ranade", "community": "0"}, {"person": "Frank Johnson", "community": "0"}, {"person": "Dadabhai", "community": "0"}, {"person": "Jinnah Saheb", "community": "0"}, {"person": "Pherozeshah", "community": "0"}, {"person": "Pearson", "community": "0"}, {"person": "Pierre Ceresole", "community": "3"}, {"person": "Gokhale", "community": "0"}, {"person": "John Nevin Sayre", "community": "1"}, {"person": "Henry Eaton", "community": "3"}, {"person": "Rajaji", "community": "0"}, {"person": "Charlie Andrews", "community": "0"}, {"person": "Sardar Vallabhbhai", "community": "0"}, {"person": "Shri Savarkar", "community": "0"}, {"person": "Shek", "community": "0"}, {"person": "De Valera", "community": "2"}, {"person": "Jawaharlal", "community": "0"}]

import pandas as pd
import holoviews as hv
from holoviews import opts, dim
import numpy as np
hv.extension('bokeh')
hv.output(size=300)

##Read the edge data and community data for the chordial
df_json = pd.DataFrame(edge_data)
com_json = pd.DataFrame(community_data)

##Creating pandas dataframe from edge-data with columns source, target and value
df_links = pd.DataFrame(columns = ['source', 'target', 'value'])
df_links['source'] = df_json['from'].values.tolist()
df_links['target'] = df_json['to'].values.tolist()
df_links['value'] = df_json['value'].values.tolist()

##Creating pandas dataframe from community data to associate each node with a particular community
df_nodes = pd.DataFrame(columns=['index', 'source', 'community'])
df_nodes['source'] =  com_json['person'].values.tolist()
df_nodes['community'] = com_json['community'].values.tolist()
df_nodes = df_nodes.sort_values('community')
df_nodes['index'] = [x for x in range(0, len(df_nodes.values))]

##Creating a mapper dictionary to assign each node to a numerical unique value
mapper = {}
df_dict = df_nodes.to_dict()
for items, values in df_dict['index'].items():
    mapper[df_dict['source'][items]] = values
    
##Joining edge-data-frame with community data-frame to assign edge source with the source community    
df_edge_with_community = pd.merge(df_links, df_nodes, on='source')
del df_edge_with_community['index']
df_edge_with_community.rename(columns={'community': 'edge_community'}, inplace=True)

##Assigning each node to numerical value
df_edge_with_community['source'] = df_edge_with_community['source'].map(mapper)
df_edge_with_community['target'] = df_edge_with_community['target'].map(mapper)

##Creating hv dataset from df_nodes
nodes = hv.Dataset(df_nodes, 'index')

##Creating Chord
chord = hv.Chord((df_edge_with_community, nodes)).select(value=(1, None))
chord.opts(
    opts.Chord(cmap='Category10', edge_cmap='Category10', edge_color=dim('edge_community').str(),
               labels='source',  label_text_font_size='10px',label_text_font_style='bold',  node_color=dim('community').str(),
               edge_alpha= 0.8, node_selection_fill_color=None, edge_nonselection_line_alpha=0, edge_line_width=1,
              edge_hover_line_color=None))

I don’t think the automated labeling is going to provide a good result here whatever you try. You may have to manually label the plot with hv.Labels.

1 Like

@philippjfr Thanks for the reply. I can see that the angle generated for each node is proportional to the number of chords associated with the node.

Can you suggest how to use the hv.Labels for the chord dataset? For example I have the nodes data containing the index and name of the nodes and I want to use the name as labels to my Chord plot. How can I specify the nodes data in hv.Labels to manually label the plot? I had referred to this page Holoviews Labels for making manual labels to my chord plot but was unsure how to use the data for chord.