👉引言💎
铭记于心 | ||
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉 |
官方参考文档:
👉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-=
这些主要是基于上面的代码做一些修改
💖写在最后💖:
路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!