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.
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.
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.
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.
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()
@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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With