效果图

代码
import networkx as nx
import matplotlib.pyplot as plt
class Graph_Matrix:
"""
Adjacency Matrix
"""
def __init__(self, vertices=[], matrix=[]):
"""
:param vertices:a dict with vertex id and index of matrix , such as {vertex:index}
:param matrix: a matrix
"""
self.matrix = matrix
self.edges_dict = {}
self.edges_array = []
self.vertices = vertices
self.num_edges = 0
if len(matrix) > 0:
if len(vertices) != len(matrix):
raise IndexError
self.edges = self.getAllEdges()
self.num_edges = len(self.edges)
elif len(vertices) > 0:
self.matrix = [[0 for col in range(len(vertices))] for row in range(len(vertices))]
self.num_vertices = len(self.matrix)
def isOutRange(self, x):
try:
if x >= self.num_vertices or x <= 0:
raise IndexError
except IndexError:
print("节点下标出界")
def isEmpty(self):
if self.num_vertices == 0:
self.num_vertices = len(self.matrix)
return self.num_vertices == 0
def add_vertex(self, key):
if key not in self.vertices:
self.vertices[key] = len(self.vertices) + 1
for i in range(self.getVerticesNumbers()):
self.matrix[i].append(0)
self.num_vertices += 1
nRow = [0] * self.num_vertices
self.matrix.append(nRow)
def getVertex(self, key):
pass
def add_edges_from_list(self, edges_list):
for i in range(len(edges_list)):
self.add_edge(edges_list[i][0], edges_list[i][1], edges_list[i][2], )
def add_edge(self, tail, head, cost=0):
if tail not in self.vertices:
self.add_vertex(tail)
if head not in self.vertices:
self.add_vertex(head)
self.matrix[self.vertices.index(tail)][self.vertices.index(head)] = cost
self.edges_dict[(tail, head)] = cost
self.edges_array.append((tail, head, cost))
self.num_edges = len(self.edges_dict)
def getEdges(self, V):
pass
def getVerticesNumbers(self):
if self.num_vertices == 0:
self.num_vertices = len(self.matrix)
return self.num_vertices
def getAllVertices(self):
return self.vertices
def getAllEdges(self):
for i in range(len(self.matrix)):
for j in range(len(self.matrix)):
if 0 < self.matrix[i][j] < float('inf'):
self.edges_dict[self.vertices[i], self.vertices[j]] = self.matrix[i][j]
self.edges_array.append([self.vertices[i], self.vertices[j], self.matrix[i][j]])
return self.edges_array
def __repr__(self):
return str(''.join(str(i) for i in self.matrix))
def to_do_vertex(self, i):
print('vertex: %s' % (self.vertices[i]))
def to_do_edge(self, w, k):
print('edge tail: %s, edge head: %s, weight: %s' % (self.vertices[w], self.vertices[k], str(self.matrix[w][k])))
def create_undirected_matrix(my_graph):
nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
matrix = [[0, 1, 1, 1, 1, 1, 0, 0],
[0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 1, 1],
[0, 0, 0, 0, 0, 1, 0, 1],
[0, 0, 0, 0, 0, 1, 1, 0]]
my_graph = Graph_Matrix(nodes, matrix)
return my_graph
def create_directed_matrix(my_graph):
nodes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
inf = float('inf')
matrix = [[0, 2, 1, 3, 9, 4, inf, inf],
[4, 0, 4, inf, 3, inf, inf, inf],
[inf, inf, 0, 8, inf, inf, inf, inf],
[inf, inf, inf, 0, 7, inf, inf, inf],
[inf, inf, inf, inf, 0, 5, inf, inf],
[inf, inf, 2, inf, inf, 0, 2, 2],
[inf, inf, inf, inf, inf, 1, 0, 6],
[inf, inf, inf, inf, inf, 9, 8, 0]]
my_graph = Graph_Matrix(nodes, matrix)
return my_graph
def draw_undircted_graph(my_graph):
G = nx.Graph()
for node in my_graph.vertices:
G.add_node(str(node))
for edge in my_graph.edges:
G.add_edge(str(edge[0]), str(edge[1]))
nx.draw(G, with_labels=True)
plt.savefig("undirected_graph.png")
plt.show()
def draw_directed_graph(my_graph):
G = nx.DiGraph()
for node in my_graph.vertices:
G.add_node(str(node))
G.add_weighted_edges_from(my_graph.edges_array)
print("nodes:", G.nodes())
print("edges:", G.edges())
print("number of edges:", G.number_of_edges())
labels = nx.get_edge_attributes(G,"weight")
print(type(labels))
print(labels)
for key,values in labels.items():
weight={}
weight[list(key)[0]+"-"+list(key)[1]]=values
labels[key]=weight
plt.figure(3,figsize=(12,12))
pos=nx.circular_layout(G)
nx.draw_networkx_nodes(G,pos=nx.circular_layout(G),nodelist=G.nodes,alpha=0.4,node_color='red',node_shape='v',node_size=220)
nx.draw_networkx_labels(G,pos=nx.circular_layout(G),font_color='k',alpha=1)
nx.draw_networkx_edge_labels(G, pos=nx.circular_layout(G), edge_labels=labels, label_pos=0.3, font_size=7)
nx.draw(G, with_labels=True, pos=nx.circular_layout(G), node_size=1500, alpha=0.3, font_weight="bold", arrows=True, connectionstyle='arc3, rad = 0.1')
plt.savefig("directed_graph3.png")
plt.show()
if __name__ == '__main__':
my_graph = Graph_Matrix()
created_graph = create_directed_matrix(my_graph)
draw_directed_graph(created_graph)