Search code examples
pythongraphnodesnetworkxtabulate

NetworkX Graph attributes in a single table


I am trying to create a table displaying the attributes of nodes in a NetworkX (using Python) graph. The functions used to get these attributes generate a list of the nodes with their assigned attribute and are generated like in the following:

import networkx as nx

# degrees of nodes
pprint(g.degree())

# clustering coefficient
pprint(nx.clustering(g))

I should like to be able to compile these into a table with intuitive overview in the following format:

node    degree    clustering coefficient
----------------------------------------
a       2         3
b       1         1
...

Any tips on how to do so? Perhaps using a dict and tabulate but I am not quite sure... Would be grateful for any tips!

Edit I found a way to do some simple printing, but it isn't formatted very nicely and doesn't make for nice syntax:

for n in g.nodes():
    print(n, g.degree(n), nx.clustering(g, n))

Solution

  • I would use a Pandas dataframe (pd.DataFrame) to store this data, which I would construct in a list comprehension of dictionaries (each dictionary corresponding to a row in the final data frame). Here's how I would do that with two attributes, in_degree and out_degree for each node:

    import pandas as pd
    import networkx as nx
    g = nx.DiGraph()
    
    # ... populate the Digraph ...
    
    def compute_indegree(node, digraph):
      return digraph.in_degree(node)
    
    def compute_outdegree(node, digraph):
      return digraph.out_degree(node)
    
    attr_dicts = [
      { 'node': node,
        'in_degree': compute_indegree(node, g), \
        'out_degree': compute_outdegree(node, g)} \
      for node in g.nodes
    ]
    
    dataframe = pd.DataFrame(attr_dicts)
    dataframe.set_index('node', inplace=True)
    print(dataframe)
    

    The final print line neatly formats the resulting DataFrame:

    Printline results

    If you modify or add the above functions compute_indegree and compute_outdegree to return other stats like your clustering coefficient, the table will still populate as above.