python?NetworkX庫生成并繪制帶權(quán)無向圖
NetworkX是一個(gè)非常強(qiáng)大的網(wǎng)絡(luò)科學(xué)工具,它封裝了圖的數(shù)據(jù)結(jié)構(gòu)和許多經(jīng)典圖算法,也內(nèi)置了許多可視化函數(shù)可供調(diào)用。
1. 隨機(jī)圖生成
最經(jīng)典的隨機(jī)圖當(dāng)屬我們?cè)谏弦黄┛?a href="http://chabaoo.cn/article/247983.htm" rel="external nofollow" target="_blank">《Erdos-Renyi隨機(jī)圖的生成方式及其特性》中講到的Erd?s-Rény隨機(jī)圖了,我們這里選用其中的Gnp??np形式,調(diào)用以下API:
G = nx.erdos_renyi_graph(10, 0.3, seed=1)
這里表示生成10個(gè)頂點(diǎn)的圖,且圖的每條邊都以0.3的概率產(chǎn)生。
當(dāng)然,此時(shí)生成的圖不具有權(quán)重,我們想在此基礎(chǔ)上均勻隨機(jī)初始化[0, 0.4]之間的權(quán)重,可以這樣寫:
G = nx.Graph() for u, v in nx.erdos_renyi_graph(10, 0.3, seed=1).edges(): G.add_edge(u, v, weight=random.uniform(0, 0.4))
2. 2D布局可視化
隨機(jī)圖生成好之后,我們就要對(duì)其進(jìn)行可視化了。首先我們需要計(jì)算每個(gè)節(jié)點(diǎn)在圖中擺放的位置,經(jīng)典的Fruchterman-Reingold force-directed 算法可以完成這個(gè)操作,對(duì)應(yīng)NetworkX中的spring_layout
函數(shù):
pos = nx.spring_layout(G, iterations=20) #我們?cè)O(shè)算法迭代次數(shù)為20次
然后就可以分別繪制圖的邊、節(jié)點(diǎn)和節(jié)點(diǎn)標(biāo)簽了:
nx.draw_networkx_edges(G, pos, edge_color="orange") nx.draw_networkx_nodes(G, pos, node_color="black") nx.draw_networkx_labels(G, pos, font_color="white") plt.show()
繪圖結(jié)果如下:
當(dāng)然,這樣圖的權(quán)值是無法體現(xiàn)于圖上的,如果我們需要圖的權(quán)值體現(xiàn)于圖上,可以使圖中邊的寬度按照權(quán)值大小來設(shè)置:
nx.draw_networkx_edges(G,pos, width=[float(d['weight']*10) for (u,v,d) in G.edges(data=True)], edge_color="orange") nx.draw_networkx_nodes(G,pos, node_color="black") nx.draw_networkx_labels(G, pos, font_color="white") plt.show()
此時(shí)的繪圖結(jié)果如下:
3. 3D布局可視化
如果你覺得2D布局過于扁平,還不夠直觀地體現(xiàn)節(jié)點(diǎn)之間的拓?fù)潢P(guān)系,那你可以采用如下的代碼對(duì)圖進(jìn)行三維可視化:
# 3d spring layout pos = nx.spring_layout(G, dim=3, seed=779) # Extract node and edge positions from the layout node_xyz = np.array([pos[v] for v in sorted(G)]) edge_xyz = np.array([(pos[u], pos[v]) for u, v in G.edges()]) # Create the 3D figure fig = plt.figure() ax = fig.add_subplot(111, projection="3d") # Plot the nodes - alpha is scaled by "depth" automatically ax.scatter(*node_xyz.T, s=100, ec="w") # Plot the edges for vizedge in edge_xyz: ax.plot(*vizedge.T, color="tab:gray") def _format_axes(ax): """Visualization options for the 3D axes.""" # Turn gridlines off ax.grid(False) # Suppress tick labels for dim in (ax.xaxis, ax.yaxis, ax.zaxis): dim.set_ticks([]) # Set axes labels ax.set_xlabel("x") ax.set_ylabel("y") ax.set_zlabel("z") _format_axes(ax) fig.tight_layout() plt.show()
此時(shí)的繪圖結(jié)果如下:
參考
以上就是python NetworkX庫生成并繪制帶權(quán)無向圖的詳細(xì)內(nèi)容,更多關(guān)于NetworkX庫繪制帶權(quán)無向圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 如何使用python中的networkx來生成一個(gè)圖
- Python networkx中獲取圖的鄰接矩陣方式
- Python利用networkx畫圖繪制Les?Misérables人物關(guān)系
- Python networkx包的實(shí)現(xiàn)
- 使用Python的networkx繪制精美網(wǎng)絡(luò)圖教程
- python networkx 根據(jù)圖的權(quán)重畫圖實(shí)現(xiàn)
- python networkx 包繪制復(fù)雜網(wǎng)絡(luò)關(guān)系圖的實(shí)現(xiàn)
- Python 學(xué)習(xí)教程之networkx
- python中networkx函數(shù)的具體使用
相關(guān)文章
node.js獲取參數(shù)的常用方法(總結(jié))
下面小編就為大家?guī)硪黄猲ode.js獲取參數(shù)的常用方法(總結(jié))。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Python接口自動(dòng)化之淺析requests模塊get請(qǐng)求
這篇文章主要介紹了requests模塊get請(qǐng)求,在Python語言中,雖然提供了urllib2和urllib的庫,但是相比較而言,Requests仍然是實(shí)現(xiàn)接口測(cè)試最好的選擇,因?yàn)樗怯闷饋砀雍?jiǎn)便2021-08-08Python自動(dòng)錄入ERP系統(tǒng)數(shù)據(jù)
這篇文章主要介紹了Python如何自動(dòng)錄入ERP系統(tǒng)數(shù)據(jù),用Python解決Excel問題的最佳方法,文章中有詳細(xì)的代碼示例,需要的朋友可以參考閱讀2023-04-04Python-flask調(diào)用接口返回中文數(shù)據(jù)問題
這篇文章主要介紹了Python-flask調(diào)用接口返回中文數(shù)據(jù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03python如何求數(shù)組連續(xù)最大和的示例代碼
這篇文章主要介紹了python如何求數(shù)組連續(xù)最大和的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Python time模塊詳解(常用函數(shù)實(shí)例講解,非常好)
在平常的代碼中,我們常常需要與時(shí)間打交道。在Python中,與時(shí)間處理有關(guān)的模塊就包括:time,datetime以及calendar。這篇文章,主要講解time模塊。2014-04-04