點擊這裡
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-=
這些主要是基於上面的代碼做一些修改
寫在最後:
路漫漫其修遠兮,吾將上下而求索!伙伴們,明天見!