Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node size dependent on the node degree on NetworkX

I imported my Facebook data onto my computer in the form of a .json file. The data is in the format:

{"nodes":[{"name":"Alan"},{"name":"Bob"}],"links":[{"source":0,"target:1"}]} 

Then, I use this function:

def parse_graph(filename): """ Returns networkx graph object of facebook social network in json format """ G = nx.Graph() json_data=open(filename) data = json.load(json_data) # The nodes represent the names of the respective people # See networkx documentation for information on add_* functions G.add_nodes_from([n['name'] for n in data['nodes']]) G.add_edges_from([(data['nodes'][e['source']]['name'],data['nodes'][e['target']]['name']) for e in data['links']]) json_data.close() return G 

to enable this .json file to be used a graph on NetworkX. If I find the degree of the nodes, the only method I know how to use is:

degree = nx.degree(p) 

Where p is the graph of all my friends. Now, I want to plot the graph such that the size of the node is the same as the degree of that node. How do I do this?

Using:

nx.draw(G,node_size=degree) 

didn't work and I can't think of another method.

like image 603
sunny Avatar asked May 15 '13 13:05

sunny


People also ask

How does NetworkX calculate degree of node?

degree(). The node degree is the number of edges adjacent to the node. The weighted node degree is the sum of the edge weights for edges incident to that node. This object provides an iterator for (node, degree) as well as lookup for the degree for a single node.

How does NetworkX calculate average degree?

The average degree of an undirected graph is the sum of the degrees of all its nodes divided by the number of nodes in the graph.

Can NetworkX handle large graphs?

NX is certainly capable of handling graphs that large, however, performance will largely be a function of your hardware setup. Aric will likely give a better answer, but NX loads graphs into memory at once, so in the ranges your are describing you will need a substantial amount of free memory for it to work.


2 Answers

Update for those using networkx 2.x

The API has changed from v1.x to v2.x. networkx.degree no longer returns a dict but a DegreeView Object as per the documentation.

There is a guide for migrating from 1.x to 2.x here.

In this case it basically boils down to using dict(g.degree) instead of d = nx.degree(g).

The updated code looks like this:

import networkx as nx import matplotlib.pyplot as plt  g = nx.Graph() g.add_edges_from([(1,2), (2,3), (2,4), (3,4)])  d = dict(g.degree)  nx.draw(g, nodelist=d.keys(), node_size=[v * 100 for v in d.values()]) plt.show() 

nx.degree(p) returns a dict while the node_size keywod argument needs a scalar or an array of sizes. You can use the dict nx.degree returns like this:

import networkx as nx import matplotlib.pyplot as plt  g = nx.Graph() g.add_edges_from([(1,2), (2,3), (2,4), (3,4)])  d = nx.degree(g)  nx.draw(g, nodelist=d.keys(), node_size=[v * 100 for v in d.values()]) plt.show() 

enter image description here

like image 127
miles82 Avatar answered Sep 21 '22 22:09

miles82


@miles82 provided a great answer. However, if you've already added the nodes to your graph using something like G.add_nodes_from(nodes), then I found that d = nx.degree(G) may not return the degrees in the same order as your nodes.

Building off the previous answer, you can modify the solution slightly to ensure the degrees are in the correct order:

d = nx.degree(G) d = [(d[node]+1) * 20 for node in G.nodes()] 

Note the d[node]+1, which will be sure that nodes of degree zero are added to the chart.

like image 29
Tchotchke Avatar answered Sep 18 '22 22:09

Tchotchke