Python - 使用 Matplotlib 視覺化 NetworkX 生成的圖形


簡介

Python 是一種靈活的程式語言,以其易用性和清晰度而聞名。它提供了許多庫和元件來簡化各種任務,包括建立和顯示圖形。NetworkX 是一個強大的 Python 工具包,用於構建、修改和分析複雜網路的結構、動力學和功能。而 Matplotlib 則是一個流行的工具包,用於在 Python 中建立靜態、動畫和互動式視覺化。

定義

NetworkX 是一個 Python 庫,用於構建、修改和分析複雜網路的結構、動力學和功能。它提供了許多功能和數學公式來生成各種圖形表示,包括有向圖、無向圖、多重圖和二部圖。

Matplotlib 提供了廣泛的功能來使用 Python 生成靜態、動態和互動式繪圖。它提供了多種視覺化資料的方式,例如折線圖、散點圖、條形圖、直方圖等等。

語法

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(2, 3)
nx.draw(G)
plt.show()
plt.savefig("filename.png")        

程式的第一步是匯入必要的模組,即 `networkx` 和 `matplotlib.pyplot`。然後,使用 `networkx` 庫中的 `Graph()` 函式建立一個空的圖形變數 `G`。

為了定義圖形的佈局,透過 `add_edge()` 函式放置兩條連線線。

一旦圖形的結構定義完成,程式就會使用 `networkx` 框架中的 `draw()` 函式來視覺化圖形。`draw()` 方法接收圖形 `G` 作為引數,並生成網路的視覺化輸出。預設情況下,`draw()` 函式使用彈簧佈局演算法來放置節點。它顯示具有預設視覺化屬性的繪圖。

來自 `matplotlib.pyplot` 庫的 `show()` 函式呼叫用於顯示生成的繪圖。根據指令碼執行的環境。

最後,程式將圖表儲存為名為“filename.png”的影像檔案。它使用 `matplotlib.pyplot` 框架中的 `savefig()` 函式。此函式允許使用者指定檔名和格式(如 PNG、JPEG、PDF)以儲存繪圖。在本例中,圖表將儲存為 PNG 格式的影像,檔名為“filetitle.png”。該檔案將儲存在與 Python 指令碼或筆記本相同的資料夾中。

演算法

  • 步驟 1:匯入所需的庫:networkx 和 matplotlib.pyplot。

  • 步驟 2:使用 NetworkX 生成圖形。

  • 步驟 3:使用 Matplotlib 繪製圖形。

  • 步驟 4:將圖形的繪製結果儲存到檔案中。

  • 步驟 5:顯示圖形的繪製結果。

方法

  • 方法 1:使用節點標籤和邊權重視覺化圖形

  • 方法 2:使用子圖視覺化大型圖形

方法 1:使用節點標籤和邊權重視覺化圖形

示例

import networkx as nx
import matplotlib.pyplot as plt

# Create graph
G = nx.Graph()

# Add nodes
G.add_node(1, label='A')
G.add_node(2, label='B')
G.add_node(3, label='C')
G.add_node(4, label='D')

# Add edges
G.add_edge(1, 2, weight=4)
G.add_edge(2, 3, weight=7)
G.add_edge(3, 1, weight=2)
G.add_edge(1, 4, weight=5)

# Set node positions
pos = nx.spring_layout(G)

# Draw nodes and labels
nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos, labels=nx.get_node_attributes(G, 'label'))

# Draw edges with weights
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw_networkx_edges(G, pos)

# Show graph
plt.axis('off')
plt.show()

輸出

我們使用 NetworkX 中的 Graph() 函式建立一個名為 G 的空圖形物件。

現在是時候用節點填充我們的圖形了。為了向圖形新增單個節點,我們使用 add_node() 函式。每個節點都被賦予一個唯一的識別符號,我們還可以使用自定義屬性為節點新增標籤。在本例中,我們將節點 1 標記為“A”,節點 2 標記為“B”,節點 3 標記為“C”,節點 4 標記為“D”。

在新增節點後,我們將建立邊來連線這些節點。為了在節點之間新增邊,我們使用 add_edge() 函式。例如,節點 1 和 2 透過一個權重為 4 的邊連線。

為了檢視圖形,我們首先需要放置節點。為了自動計算節點的位置,我們使用 NetworkX 的 spring_layout() 方法。此函式應用了一種演算法,試圖以美觀的方式排列節點。

現在是最激動人心的部分——視覺化圖形!我們使用各種 NetworkX 函式和 Matplotlib 來建立繪圖。我們首先使用 draw_networkx_nodes() 繪製節點,並使用 draw_networkx_labels() 繪製標籤。我們將圖形物件 G 和我們之前計算的位置 pos 作為引數傳遞。這確保了節點和標籤顯示在正確的位置。

為了視覺化邊,我們也使用 draw_networkx_edges() 函式繪製它們。此外,我們使用 draw_networkx_edge_labels() 函式包含邊權重。此函式在相應的邊附近新增邊權重作為標籤。

最後,我們使用 plt.show() 顯示圖形繪圖。這將開啟一個視窗或在 Jupyter Notebook 介面中顯示繪圖。為了使繪圖看起來更簡潔,並且更專注於圖形本身,我們使用 plt.axis('off') 關閉座標軸的可見性。

方法 2:使用子圖視覺化大型圖形

示例

import networkx as nx
import matplotlib.pyplot as plt

# Create graph
G = nx.path_graph(5)

# Create subplots
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))

# Plot original graph
axs[0].set_title('Original Graph')
nx.draw(G, ax=axs[0])

# Plot modified graph
axs[1].set_title('Modified Graph')
pos = nx.spring_layout(G)
nx.draw(G, pos=pos, ax=axs[1], node_color='r', node_size=500, with_labels=False)
plt.suptitle('Visualization of Large Graph with Subplots')
plt.show()

輸出

首先,我們匯入必要的庫:NetworkX 和 Matplotlib.pyplot。這些庫為我們提供了建立和視覺化圖形的函式和工具。

接下來,我們使用 NetworkX 中的 path_graph() 函式建立一個名為 G 的圖形物件。此函式生成一個簡單的路徑圖形,其中 5 個節點以線性方式連線。

為了組織視覺化,我們使用 Matplotlib 的 subplots() 方法構建子圖。我們指定子圖的行數和列數(在本例中為一行兩列),以及圖形大小。

這有助於我們將繪圖區域劃分為多個部分以顯示不同的圖形。

現在,是時候在第一個子圖上繪製原始圖形了。我們使用索引 0 訪問第一個子圖,並使用 set_title() 函式設定其標題。然後,我們使用 NetworkX 中的 draw() 函式在此子圖上視覺化原始圖形。

接下來是第二個子圖,我們重複此過程。我們設定其標題並使用索引 1 訪問它。我們還使用 NetworkX 中的 spring_layout() 函式計算節點位置,該函式以美觀的方式排列節點。然後,我們再次使用 draw() 函式在此子圖上視覺化修改後的圖形。在這裡,我們可以自定義節點顏色、大小和標籤,以將其與原始圖形區分開來。

為了增強整體呈現效果,我們使用 Matplotlib 中的 suptitle() 函式為整個圖形新增一個公共標題。

結論

透過以上學習,我們正確地瞭解了這些主題。我們已經成功地建立了一個圖形,設定了子圖,並使用 NetworkX 和 Matplotlib 可視化了圖形。

更新於: 2023年7月27日

2K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.