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