networkx 画有权图_利用NetworkX画网络图
現在各種商業和開源的網絡可視化的工具非常多,NetworkX - NetworkX是一個非常重要的網絡分析工具。當然它側重于對網絡結構的分析,也包含了網絡可視化部分。我最近由于要畫一些張量網絡圖,所以找到了這個工具。另一個值得推薦的是Latex中基于tikz實現的hackl/tikz-network工具,這個更側重于畫圖,效果非常漂亮。這里重點介紹NetworkX如何可視化。至于網絡拓撲結構的分析,專家可以仔細看相應文檔,我只是為了畫圖,所以只用到關于圖的最基本屬性。本文共分三個部分,分別是:NetworkX中的基本對象:節點和邊;
NetworkX中的可視化函數;
存在的一些問題。
NetworkX中的基本對象:節點和邊
NetworkX主要是分析圖的結果的,因此可以創建的圖的種類很多,這里只利用Graph。在畫圖前,首先要建立一個網絡圖,代碼如下。
import networkx as nx
G = nx.Graph()
這個時候的圖是空的,其中沒有任何節點(node)和連接或者說是邊(edge)。所以接下來要給G中添加一些節點和邊。方法非常多,我們介紹最基本的,add_node和add_edge。
G.add_node(1)
G.add_edge(2,3)
上面兩段代碼的意思分別是:
1行:增加一個節點1
2行:增加一條邊從節點2到節點3,由于沒有手動添加節點2,3。程序會自己自動添加2和3。
加入說要畫四個原子形成的一維鏈,那么完整的代碼為:
import networkx as nx
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
如果這里不用1,2,3,4,標記,用其它任何可hashable的對象都可以,我這里只是畫圖就不說了。
NetworkX中的可視化函數
如果要把剛才的網絡畫出來,那么直接調用draw函數即可代碼和圖如下:
import networkx as nx
from pylab import show
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
nx.draw(G)
show()
在默認的情況下,節點的位置是隨機的,因此畫出來的圖并不是一條鏈,為了讓確定的節點出現在特定的位置上,有兩種做法。這里由于只是畫圖,我們利用draw中的pos參數修改,代碼如下。注意這里pos是一個字典,key對應于節點的名字,后面是節點的坐標。
import networkx as nx
from pylab import show
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
position={1:(1,0),2:(2,0),3:(3,0),4:(4,0)}
nx.draw(G,pos=position)
show()
除了可以控制節點的位置,顏色大小,形狀等屬性都可以任意設置,比方下面的代碼把上面的鏈條節點改成不同的顏色,大小。
import networkx as nx
from pylab import show
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
position={1:(1,0),2:(2,0),3:(3,0),4:(4,0)}
ncolor=['r','b','k','g']
nsize=[600,400,200,100]
nx.draw(G,pos=position,node_color=ncolor,node_shape='>',node_size=nsize)
show()
還可以給每一個節點添加一個名字等等這些通過參數可以設定就不一一介紹了。
如果我們只想畫一些節點和一些邊,并不想讓所有的節點出現,那么可以通過nodelist這個參數控制。比方上面的圖,我們不想出現最后一個節點,那么只需要把代碼改為:
import networkx as nx
from pylab import show
G = nx.Graph()
G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(3,4)
position={1:(1,0),2:(2,0),3:(3,0),4:(4,0)}
ncolor=['r','b','k','g']
#nshape=['o','d','>','v']
nsize=[600,400,200,100]
NL=[1,2,3]
nx.draw(G,nodelist=NL,pos=position,node_color=ncolor,node_shape='>',node_size=nsize)
show()
存在的一些問題
如果仔細閱讀NetworkX源代碼會發現,可視化的方法利用了matplotlib散點圖的畫法。比方說所有的節點都是用散點圖函數scatter來實現的。因此它的使用受限于scatter的能力。并且,在draw當中,接口的參數并沒有覆蓋scatter接口中所有參數。
比方scatter函數可以修改每一個marker的edgecolor,但是在draw當中就沒有。因此如果我們想實現一個facecolor為白色,edgecolor為黑色的node,就必須修改NetworkX的代碼。而這一點恰好是我需要的,因為你要給每個node標記一個名字的話,顯然白底黑邊比較合適。
再比如散點圖本身默認的功能,只能實現所有的marker形狀是相同的,因此在畫散點圖的時候,要控制不同的點對應不同的marker,需要使用mask函數過濾。例如Scatter Masked - Matplotlib 2.1.1 documentation。在NetworkX中也不能直接實現,不過可以通過另外兩個函數draw_networkx_nodes和draw_networkx_edges分別畫節點和邊。或者在Graph中添加node和edge的時候,順便加上相應的屬性。
總結
以上是生活随笔為你收集整理的networkx 画有权图_利用NetworkX画网络图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel中n函数怎么使用
- 下一篇: python网络运维案例代码库_OLDb