Home > Software engineering >  Plot distribution of node attributes networkx
Plot distribution of node attributes networkx

Time:10-28

The nodes in a directed graph has Name, Age and Height as attributes. I want to plot the distribution of the three attributes, is that possible?

I know that it is possible to get attributes this way:

name = nx.get_node_attributes(G, "Name")
age = nx.get_node_attributes(G, "Age")
height = nx.get_node_attributes(G, "Height")

But I don't really get how I can use those instead of G in function below?

import networkx as nx

def plot_degree_dist(G):
    degrees = [G.degree(n) for n in G.nodes()]
    plt.hist(degrees)
    plt.show()

plot_degree_dist(nx.gnp_random_graph(100, 0.5, directed=True))

enter image description here

Or is there some better way to do plot the distribution of node attributes?

CodePudding user response:

Seems like a perfectly reasonable way to me. I'm not aware of any more convenient method. To be more generalizable, add an argument to your function that takes the name of the attribute you'd like to plot.

Just know that nx.get_node_attributes() returns a dictionary keyed to the nodes. Since we're just plotting the distribution, we're only interested in the values and not the keys.

Here's a self-contained example following your lead:

import networkx as nx
import matplotlib.pyplot as plt
import numpy as np


def plot_attribute_dist(G, attribute):
    attribute = nx.get_node_attributes(G, attribute).values()
    plt.hist(attribute)
    plt.show()


attribute_name = 'Name'

G = nx.gnp_random_graph(100, 0.5, directed=True)

rng = np.random.default_rng(seed=42)
for node, data in G.nodes(data=True):
    data[attribute_name] = rng.normal()

plot_attribute_dist(G, attribute_name)

which outputs

node_attribute_distribution

  • Related