python用network模塊解讀人物關系


  在我們生活的世界中,每一個人以及每一個事物相互之間都存在着關系,有直接關系,也有間接關系,最終會形成一個無形的大的關系網。network模塊是一個用python語言開發的圖論和復雜網絡建模工具,模塊內置了常用的圖與復雜網絡分析算法。network模塊有四種圖:Graph、DiGraph、MultiGraph、MultiDigraph,分別為無多重邊無向圖、無多重邊有向圖、有多重邊無向圖、有多重邊有向圖。其中Graph是用點和線來刻畫離散事物集合中,每對事物間以某種方式相聯系的數學模型。

下面我們來分析《復仇者聯盟4》人物關系:

import pandas as pd
#導入繪圖模塊
import networkx as nx
import matplotlib.pyplot as plt
# 讀取文件
aa =r'F:\\python入門\\python編程錦囊\\Code(實例源碼及使用說明)\\Code(實例源碼及使用說明)\\Code(實例源碼及使用說明)\\09\\data\\fl4.xls'
df = pd.DataFrame(pd.read_excel(aa))
#去除重復項,並轉換成列表
df1=df['label1'].drop_duplicates().values.tolist()
df2=df[['label1','label2','weight']]
#設置畫布大小
plt.figure(figsize=(6, 5))
#顏色數據
colors = df['color'].drop_duplicates().values.tolist()
#G:圖表,一個networkx圖
G = nx.Graph()
# 添加邊
for i in df2.index:
    G.add_edge(df2.label1[i], df2.label2[i], weight=df2.weight[i])
# 定義兩個邊,並給邊賦予權重,其中u是起點,v是終點,d是權重
edge1 = [(u, v) for (u, v, d) in G.edges(data=True) if (d['weight'] >=1)]
edge2 = [(u, v) for (u, v, d) in G.edges(data=True) if (d['weight'] >=15)]
# 圖的布局
# 節點在一個圓環上均勻分布
pos = nx.circular_layout(G)
#用Fruchterman-Reingold算法排列節點
#pos=nx.spring_layout(G)
#節點隨機分布
#pos=nx.spring_layout(G)
#
#node_size指定節點的尺寸大小,默認值為300
#node_color指定節點的顏色,默認值為紅色
#node_shape節點的形狀,默認值為圓形,用o表示
nx.draw_networkx_nodes(G, pos, alpha=1, node_size=200,node_color=colors,node_shape='o')
#nx.draw_networkx_nodes(G, pos, alpha=1, node_size=300,node_color=colors,node_shape='p')
#
#pos:字典類型,節點作為鍵、位置作為值。位置是長度為2的序列
#edgelist:邊緣元組的集合,只繪制指定的邊,默認值為G.edges()
#width邊的寬度,默認值為1.0
#alpha透明度,默認值為1.0(不透明),0為完全透明
#edge_color邊的顏色,默認值為黑色
#style邊的樣式,默認值為實線。
nx.draw_networkx_edges(G, pos, edgelist=edge1,width=1, alpha=0.3, edge_color='g', style='dashed')
nx.draw_networkx_edges(G, pos, edgelist=edge2, width=1.5, alpha=0.5, edge_color='red')
# 標簽
#font_size節點標簽字體大小,默認值為12
nx.draw_networkx_labels(G, pos, font_size=9)
# 生成結果
plt.axis('off')
plt.title('《復仇者聯盟4》人物關系圖')
plt.rcParams['font.size'] = 10
plt.rcParams['font.sans-serif']=['SimHei'] #解決中文亂碼
plt.show()

結果:

 

 使用力引導算法Fruchterman-Reingold排列點畫圖,可以大大減少邊的交叉,只需要改兩行代碼即可:

#用Fruchterman-Reingold算法排列節點
pos=nx.spring_layout(G)
#
nx.draw_networkx_nodes(G, pos, alpha=1, node_size=300,node_color=colors,node_shape='p')

結果:

 

 

 

 

                  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM