【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'

然后完成图的初始化,将表用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

可视化如下所示:

在这里插入图片描述

将一些结点以虚线相连,并且突出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-=

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想new的出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值