• 【Python | Networks库详解】最佳实践(22年电工杯B题之路径可视化)


      👉引言💎

    在这里插入图片描述

    铭记于心
    🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

    官方参考文档:

    点击这里

    👉networks?

    networkx是Python的一个包,用于构建和操作复杂的图结构,提供分析图的算法。图是由顶点、边和可选的属性构成的数据结构,顶点表示数据,边是由两个顶点唯一确定的,表示两个顶点之间的关系。顶点和边也可以拥有更多的属性,以存储更多的信息。
    对于networkx创建的无向图,允许一条边的两个顶点是相同的,即允许出现自循环,但是不允许两个顶点之间存在多条边,即出现平行边。边和顶点都可以有自定义的属性,属性称作边和顶点的数据,每一个属性都是一个Key:Value对。

    一、将该表格中的数据以图的形式可视化
    在这里插入图片描述

    • 首先导入所需要的包,以及上面信息表所在的路径
    from matplotlib import pyplot as plt  # 绘图
    import networkx as nx
    import pandas as pd  # 读取exal文件
    path=r'D:\date\python\study\saveLab\附件1.xlsx'
    
    • 1
    • 2
    • 3
    • 4

    然后完成图的初始化,将表用pandas读取为DataFrame
    将表格信息转换为一个字典,其中key为 边集,表示了边的信息,value为 距离集合,表示了对应的边的距离(权重weight)
    再然后就是比较关键的一点,也是细节比较多的一点:
    用draw方法绘制图像,这里面的参数信息要搞清楚
    pos是以什么样的布局排图,一般有:

    • spectral_layout:根据图的拉普拉斯特征向量排列节点

    • circular_layout:节点在一个圆环上均匀分布

    • random_layout:节点随机分布

    • shell_layout:节点在同心圆上分布

    • spring_layout: 用Fruchterman-Reingold算法排列节点

    这五种,然后指定颜色color,这里也可以用 颜色映射条(cmap),然后后面指定相应的映射参数(取多种颜色的话就是 放置一个list作为映射表),代码中使用的是 随机生成1,20范围的随机数 一共14次,因为一共14个点

    plt.figure()
    plt.subplot(111)
    G = nx.Graph()  # 建立一个空的无向图G
    DF = pd.read_excel(path)
    DF.set_index(DF.columns[0], inplace=True)
    DF.fillna(0, inplace=True)
    ans = {}
    for i in range(1, DF.shape[0] + 1):
        for j in range(1, DF.shape[1] + 1):
            t = (i, j)
            ans[t] = DF.loc[i, j]
    for K in list(ans.keys()):
        if ans[K] == 0:
            ans.pop(K)
    
    list(map(lambda e: G.add_edge(*e), list(ans.keys())))
    
    pos = nx.spring_layout(G)
    cm = plt.get_cmap('rainbow')
    T=list(G.edges)
    #fen
    nx.draw_networkx_nodes(G, pos=pos, cmap=cm, node_color=[np.random.randint(1, 20) for _ in range(14)])
    nx.draw_networkx_edges(G, pos=pos, edge_cmap=cm, edgelist=T,
                           edge_color=[np.random.randint(1, 10) for _ in range(24)])
    nx.draw_networkx_labels(G, pos=pos)
    # label_options = {"ec": "k", "fc": "white", "alpha": 0.5}
    nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=ans, rotate=0)
    plt.show()  # 显示一个点Ea
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    可视化如下所示:

    在这里插入图片描述

    将一些结点以虚线相连,并且突出9号结点

    list(map(lambda e: G.add_edge(*e), list(ans.keys())))
    ---------------------------------以下为代码修改部分--------------------------
        E_list2 = [(1, 2), (3, 4), (3, 6), (4, 10), (7, 11), (8, 13), (12, 13)]
        # list(map(lambda X: DEL(X), E_list2))
        pos = nx.spring_layout(G)
        cm = plt.get_cmap('rainbow')
        T=list(G.edges)
        T2=list(G.nodes)
        T2.remove(9)
        nx.draw_networkx_nodes(G, pos=pos, cmap=cm, nodelist=T2, node_color=[np.random.randint(1, 20) for _ in range(13)])
        nx.draw_networkx_nodes(G, pos=pos, cmap=cm, nodelist=[9],node_color='black',node_size=1000,node_shape='*')
        nx.draw_networkx_edges(G, pos=pos, edge_cmap=cm, edgelist=T,
                               edge_color=[np.random.randint(1, 10) for _ in range(24)])
        nx.draw_networkx_edges(G, pos=pos, edge_color='black', edgelist=E_list2, style='--')
        nx.draw_networkx_labels(G, pos=pos)
        nx.draw_networkx_labels(G, pos=pos,labels={9:'9'},font_color='white') #设置表
        nx.draw_networkx_edge_labels(G, pos=pos, edge_labels=ans, rotate=0)
        plt.show()  # 显示一个点Ea
        time-=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这些主要是基于上面的代码做一些修改
    在这里插入图片描述

    💖写在最后💖
    路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!在这里插入图片描述

  • 相关阅读:
    网工记背命令(6)----链路聚合配置
    FMEA手册第五版学习笔记(一)
    【秋招基础知识】【1】特征降维方法 PCA+LDA
    《Playing repeated games with Large Language Models》全文翻译
    折幕变形制作-插件及软件
    Vue3 + Nodejs 实战 ,文件上传项目--大文件分片上传+断点续传
    Vue学习-基础入门篇(三万字收藏篇)
    线程池实现简单案例(C语言)
    【Linux】服务器部署:CentOS 8 安装 Docker
    uniapp制作——交友盲盒
  • 原文地址:https://blog.csdn.net/runofsun/article/details/125006794