任务
- 可视化graph;
- 在图上显示每个节点的权重,即权重越大的节点颜色越深,权重越小的节点颜色越浅。
- 项目:项目地址
示例
环境
python 3.6
matplotlib 3.3.2
networkx 2.4
数据
-
graph.txt
用边数据存储的图:
0 125 1 125 2 125 3 125 4 125
-
nodes.txt
每个节点对应一个权重:
0 0.12 1 0.54 2 0.12 3 0.23 4 0.28 125 0.34
完整代码
import networkx as nx
import matplotlib.pyplot as plt
# 读入边
def read_graph_from_edges(file):
edges_str = []
with open(file, 'r') as f:
# 一次性读取所有边,但是每个边后面有个换行符’\n‘
edge_list = f.readlines()
# 删掉换行符
for edge in edge_list:
if edge[-1] == '\n':
edges_str.append(edge.rstrip('\n'))
else:
edges_str.append(edge)
# 把边变成tuple,为后面将边加入g做准备
edges = []
for edge in edges_str:
blank_pos = edge.find(' ')
node1 = int(edge[:blank_pos])
node2 = int(edge[blank_pos + 1:])
edges.append((node1, node2))
return edges
# 读入节点属性
def read_nodes(file):
nodes_str = []
with open(file, 'r') as f:
nodes_list= f.readlines()
# 删掉换行符
for node in nodes_list:
if node[-1] == '\n':
nodes_str.append(node.rstrip('\n'))
else:
nodes_str.append(node)
nodes = []
for node in nodes_str:
pos = node.find('\t')
nodeId = int(node[:pos])
weight = float(node[pos + 1:])
nodes.append((nodeId, {"weight":weight}))
return nodes
# 可视化图,其中节点的权重越大,颜色越深
def visualization(graph):
nodes_data = graph.nodes.data()
weights = []
for node in nodes_data:
weight = node[1]['weight']
weights.append(weight)
cmap = plt.cm.get_cmap('Greens')
nx.draw(graph, with_labels=True, node_color=weights, cmap=cmap)
plt.show()
def main():
# 创建一个没有节点和边的空图形
g = nx.Graph()
# 读入图
graph_file = "./data/graph.txt"
nodes_file = "./data/nodes.txt"
edges = read_graph_from_edges(graph_file)
nodes = read_nodes(nodes_file)
# 将边加入g
g.add_edges_from(edges)
# 将节点权重加入g
g.add_nodes_from(nodes)
# n = g.nodes.data()
# 可视化图中每个节点的权重,权重大的节点颜色更深
visualization(g)
if __name__ == '__main__':
main()
结果: