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

任务

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

示例

在这里插入图片描述

环境

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

结果:

在这里插入图片描述

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值