點擊上方藍字關注我們
最近發現一個特別好用的python庫,能夠繪制精美的關系圖,俗話說有好東西要學會分享,所以袁廚就肝了這篇文章,大家可以參考一下,
一、概述
NetworkX是一個用python撰寫的軟體包,便于用戶對復雜網路進行創建、操作和學習,
利用networkx可以以標準化和非標準化的資料格式存盤網路、生成多種隨機網路和經典網路、分析網路結構、建立網路模型、設計新的網路演算法、進行網路繪制等,Networkx主要用于創造、操作復雜網路,以及學習復雜網路的結構、動力學及其功能,我們用它可以將存盤在鄰接表或鄰接矩陣里的網路圖可視化,下面給大家看一下我自己畫的一個例子吧,這樣就大概可以了解怎么回事了,
上面這張圖片是我繪制的社交關系圖,其中藍色節點代表的是度最高的節點,就是社交關系最復雜的節點,
二、NetWorkx安裝
安裝方式主要有三種
1.命令列pip
2.pycharm安裝
3.官方下載whl檔案進行安裝
下面我給大家介紹最簡單方便的第一種方式吧
1.win+r進入命令列界面
2.輸入安裝代碼
pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
這里更換了豆瓣的鏡像源,可以提高下載速度,安裝其他包的時候,將networkx改成其他包名即可,
三、NetworkX基礎知識
1.創建圖
首先我們需要創建一個沒有邊和節點的圖形,說白了就是先拿出一張白紙,我們準備在白紙上作畫了,
import networkx as nx
G = nx.Graph()#無多重邊無向圖
G = nx.DiGraph()#無多重邊有向圖
G = nx.MultiGraph()#有多重邊無向圖
G = nx.MultiDiGraph()#有多重邊有向圖
可以創建四種圖形,無多重邊無向圖、無多重邊有向圖、有多重邊無向圖、有多重邊有向圖,常用的就是第一種圖了
2.添加節點
這一步的作用就是在圖中添加節點,我們可以一次添加一個節點,也可以添加一個節點串列
G.add_node(1)#添加節點1
G.add_nodes_from([2, 3])#添加節點2,3
兩個命令是不一樣的需要注意一下哦
3.添加邊
當然邊也可以單個添加和多個添加
G.add_edge('x', 'y') # 添加一條邊起點為x,終點為y
G.add_edges_from([(1, 2), (1, 3), (2, 3)]) # 添加多條邊
下面我們來看一下當前效果
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() # 無多重邊無向圖
G.add_node(1) # 添加節點1
G.add_nodes_from([2, 3]) # 添加節點2,3
G.add_nodes_from([2, 3, 4, 5, 6]) # 添加節點2,3
G.add_edge('x', 'y') # 添加一條邊起點為x,終點為y
G.add_edges_from([(1, 2), (4, 5), (5, 6), (2, 4)]);
G.add_edges_from([(1, 2), (1, 3), (2, 3)]) # 添加多條邊
nx.draw(G, with_labels=True);
plt.show()
4.給圖中的節點和邊添加屬性
運行樣式:
- `node_size`: 指定節點的尺寸大小(默認是300)
- `node_color`: 指定節點的顏色 (默認是紅色,可以用字串簡單標識顏 色,例如'r'為紅色,'b'為綠色等)
- `node_shape`: 節點的形狀(默認是圓形,用字串'o'標識)
- `alpha`: 透明度 (默認是1.0,不透明,0為完全透明)
- `width`: 邊的寬度 (默認為1.0)
- `edge_color`: 邊的顏色(默認為黑色)
- `style`: 邊的樣式(默認為實作,可選:solid|dashed|dotted,dashdot)
- `with_labels`: 節點是否帶標簽(默認為True)
- `font_size`: 節點標簽字體大小 (默認為12)
- `font_color`: 節點標簽字體顏色(默認為黑色)
- `pos`: 布局
運用布局:
circular_layout:節點在一個圓環上均勻分布
random_layout:節點隨機分布
shell_layout:節點在同心圓上分布
spring_layout: 用Fruchterman-Reingold演算法排列節點(樣子類似多中心放射狀)
spectral_layout:根據圖的拉普拉斯特征向量排列節點
我們需要在nx.draw這行代碼里面添加屬性,
下面我們來使用一下這些屬性,看看會有什么效果,
添加節點屬性
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() # 無多重邊無向圖
G.add_nodes_from([1,2,3,4,5,6]) # 添加節點2,3
G.add_edges_from([(1, 2), (4, 5), (5, 6), (2, 4),(1,3),(2,4)]);
nx.draw(G, with_labels=True,node_size=200,node_color='#7FFF00')#在這里添加屬性,添加顏色和大小
plt.show()
添加布局屬性
pos =nx.shell_layout(G)
nx.draw(G,with_labels=True,node_size=200,node_color='#7FFF00',pos=pos)
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() # 無多重邊無向圖
G.add_nodes_from([1,2,3,4,5,6,7,8,9,10]) # 添加節點2,3
G.add_edges_from([(1, 2), (4, 5), (5, 6), (2, 4),(1,3),(2,4),(3,6),(3,7),(4,8),(5,9),(7,10),(1,10)]);
pos =nx.shell_layout(G)
nx.draw(G,with_labels=True,node_size=200,node_color='#7FFF00',pos=pos)
plt.show()
我們剛才用的屬性是節點在同心圓上分布,效果如上圖,還有其他分布方式大家可以試一下,
給節點添加不同的顏色
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph() # 無多重邊無向圖
G.add_edges_from([(1,2),(2,3),(3,4),(4,1)]);
color=['#7FFF00','#0000ff','#9999ff','#ff00ff']
pos =nx.shell_layout(G)
nx.draw(G, with_labels=True,node_size=200,node_color=color,pos=pos)
plt.show()
我們還可以給每個節點設定不同的顏色,當然大小也可以,這里自由發揮就好了,
5.樣例實作
我們用了兩種不同的節點分布方式,效果如下,
import networkx as nx
import matplotlib.pyplot as plt
net_grid = nx.Graph()
# nodes
list_net_nodes = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
# edges
list_net_edges = [(1, 3), (3, 5), (5, 4), (4, 2), (2, 6),
(5, 7), (5, 8), (8, 6),
(7, 9), (8, 9), (6, 10),
(9, 11), (10, 12), (10, 13),
(11, 14), (12, 14), (12, 15),
(14, 16), (15, 16), (15, 17),
(16, 18), (17, 19),(12, 2),(12, 1),
(18, 20), (19, 7),(19, 2),(19, 1),(19, 5)]
net_grid.add_nodes_from(list_net_nodes)
net_grid.add_edges_from(list_net_edges)
pos = nx.random_layout(net_grid)#隨機分布
nx.draw_networkx_nodes(net_grid, pos=pos, node_color='#ff0000', node_size=200, alpha=0.6)#點的樣式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.5, alpha=0.4)#邊的樣式
plt.show()
學到這里基本的圖就會畫了,下面學習一下通過資料集進行繪制繪制網路圖
6.匯入資料進行繪圖
利用football資料集繪制社交關系圖,
import networkx as nx
import matplotlib.pyplot as plt
net_grid = nx.Graph()
#構建函式,提取出資料集里的邊和點
def read_gml(data):
H = nx.read_gml(data)
nodedata= H.nodes;
eagedata=H.edges;
return nodedata,eagedata
#參考函式得到邊和點
(nodeums,edgesnum)=read_gml('football.gml')
net_grid.add_nodes_from(nodeums)
net_grid.add_edges_from(edgesnum)
pos = nx.random_layout(net_grid)#隨機分布圖
nx.draw_networkx_nodes(net_grid, pos=pos, node_color='#7FFF00', node_size=150, alpha=0.7)#點的樣式
nx.draw_networkx_edges(net_grid, pos=pos, width=0.3, alpha=0.2)#邊的樣式
plt.show()
上面三張圖片是利用不同的排列方式進行排列的,Networkx還有很多強大的功能,大家可以繼續深挖,這里為大家提供一個入門參考,感謝大家的支持,如果大家感覺Networkx不能滿足大家的需求,繪制網路圖的python庫還有DGL,PyG,
如果大家需要可以后臺回復【繪圖】,獲取資料集和代碼
大家如果覺得這篇文章對大家有幫助的話,就請大家點個關注和在看吧,你們的支持對我真的幫助很大!
喜歡就點個在看再走吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/253045.html
標籤:AI
下一篇:演算法工程師大致是做什么的
