用matplotlib和networkx可视化Graph,并且用渐变色表示节点的权重

任务

  1. 可视化graph;
  2. 在图上显示每个节点的权重,即权重越大的节点颜色越深,权重越小的节点颜色越浅。

示例

用matplotlib和networkx可视化Graph,并且用渐变色表示节点的权重_第1张图片

环境

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()

结果:

用matplotlib和networkx可视化Graph,并且用渐变色表示节点的权重_第2张图片

你可能感兴趣的:(python,可视化,graph)