Storing networkx graph object with non-unique nodes as graphviz file,Asked: Aishwarya Radhakrishnan, Answered: Mohammed Kashif
【转注】如何將networkx graph用graphviz畫出來:存為dot文档格式,这个文档graphviz可以识读。
networkx的图有两种数据结构表示:1)node和edge,举例:
#https://stackoverflow.com/questions/58684915/storing-networkx-graph-object-with-non-unique-nodes-as-graphviz-file
import networkx as nx
from graphviz import Source
G = nx.MultiDiGraph()
G.add_nodes_from(list(range(5)))
labels = {
0: 'a',
1: 'b',
2: 'a',
3: 'c',
4: 'd'}
G.add_edge(0, 1)
G.add_edge(2, 1)
G.add_edge(3, 2)
G.add_edge(3, 4)
# Add the labels as a separate attribute in each node
nx.set_node_attributes(G, labels, 'label')
pos=nx.spring_layout(G)
nx.draw_networkx_nodes(G,pos)
nx.draw_networkx_edges(G,pos)
nx.draw_networkx_labels(G,pos,labels,font_size=16)
#如何將networkx graph用graphviz畫出來:存為dot.gv文档,这个文档graphviz可以识读。
nx.drawing.nx_agraph.write_dot(G, "dot.gv")
Source.from_file('dot.gv')
2)用邻接矩阵(adjacent matrix)表示,举例:
#https://networkx.github.io/documentation/stable/tutorial.html
import networkx as nx
import numpy as np
from graphviz import Source
#now create a graph from a adjacency matrix
#networkx将不对称矩阵视为对称矩阵,比如2-3有edge,3-2没有edge,那就视为2-3有edge。https://www.youtube.com/watch?v=9tZHNqDpTN4
#矩阵用row vector
A = np.matrix([[0., 1., 1., 0., 1.],
[1., 0., 1., 1., 1.],
[1., 1., 0., 1., 9.],
[0., 1., 1., 0., 1.],
[1., 1., 0., 1., 0.]])
H = nx.from_numpy_matrix(A)
nx.draw(H, node_size=1000, with_labels=True, font_weight='bold', font_size=15)
#如何將networkx graph用graphviz畫出來:存為dot.gv文档,这个文档graphviz可以识读。
nx.drawing.nx_agraph.write_dot(H, "dot.gv")
Source.from_file('dot.gv')
如果邻接矩阵edge有weight,举例:
#https://stackoverflow.com/questions/56597840/drawing-weighted-graph-from-adjacency-matrix-with-edge-labels
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
A = [
[0, 1, 0, .8, 0],
[0, 0, .4, 0, .3],
[0, 0, 0, 0, 0],
[0, 0, .6, 0, .7],
[0, 0, 0, .2, 0]]
G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)
layout = nx.spring_layout(G)
nx.draw(G, layout, node_size=1000, with_labels=True, font_weight='bold', font_size=15)
labels = nx.get_edge_attributes(G,'weight')
nx.set_edge_attributes(G, labels, "label")
nx.draw_networkx_edge_labels(G,pos=layout,edge_labels=labels)
plt.show()
#如何將networkx graph用graphviz畫出來:存為dot.gv文档,这个文档graphviz可以识读。
from graphviz import Source
nx.drawing.nx_agraph.write_dot(G, "dot_wt.gv")
Source.from_file('dot_wt.gv')