Home networkx 視覺化 python 套件相依性(中文)
Post
Cancel

networkx 視覺化 python 套件相依性(中文)

視覺化 python 套件相依性

上一篇示範如何使用 pipdeptree 輸出套件彼此之間的相依性,但不論輸出 console 或 json 都很難閱讀。 特別當套越裝越多的時候。 這邊我們使用 networkx 來視覺化 python 套件相依性,讓相依性在一張圖片上就完整顯示。

networkx 介紹

NetworkX 是一個用於創建、操作和研究複雜網絡結構(或稱圖)的 Python 庫。它提供了許多方便的功能來處理圖結構,這些圖可以是無向圖、有向圖、多重圖等。以下是 NetworkX 的一些關鍵特性和用法介紹:

###多種圖類型

  1. Graph: 用於表示無向圖。
  2. DiGraph: 用於表示有向圖。
  3. MultiGraph 和 MultiDiGraph: 用於表示多重圖(允許多條邊)。

豐富的圖操作功能

  1. 添加/刪除節點和邊。
  2. 計算圖的性質(例如度、直徑、連通分量等)。
  3. 圖的遍歷(例如深度優先搜索、廣度優先搜索)。
  4. 最短路徑算法(例如 Dijkstra、Bellman-Ford)。
  5. 圖的可視化。
  6. 圖分析和算法:

聚類和社區檢測。

  1. 網絡中心性度量(例如 PageRank、Betweenness)。
  2. 隨機圖生成。

我們這邊不會使用到 networkx 這麼多的功能,只是讓它來輸出圖片

一樣可以透過以下指令去安裝

1
pip install networkx

示範

輸出 json

用 pipdeptree 來看看 matplotlib 有多少相依的套件吧

1
pipdeptree --json --packages matplotlib > dependencies.json

完成後輸出 dependencies.json 檔

networkx 畫圖

以下的 code 主要將上面步驟輸出的 dependencies.json 讀進來。 創造一個 networkx 有向圖,將資料加進去顯示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import json
import networkx as nx
import matplotlib.pyplot as plt

# 讀取 JSON 文件
with open('dependencies.json', 'r') as f:
    data = json.load(f)

# 創建有向圖
G = nx.DiGraph()

def add_edges(node):
    """ 遞歸添加邊到圖中 """
    package_name = node['package']['package_name']
    if 'dependencies' in node:
        for dep in node['dependencies']:
            dep_name = dep['package_name']
            G.add_edge(package_name, dep_name)
            # 遞歸處理依賴
            add_edges({
                'package': {'package_name': dep_name},
                'dependencies': []  # 因為沒有依賴樹的深層結構
            })

# 從根節點開始添加邊
for root in data:
    add_edges(root)

# 繪製圖形
pos = nx.spring_layout(G, k=0.5)
nx.draw(G, pos, with_labels=True, arrows=True)
plt.savefig('dependencies_tree.png')

Note: 可調整 nx.spring_layout 及 nx.draw 等 function ,讓你的圖變得更漂亮。

matplotlib 的結果

Desktop View

ipython 的結果

Desktop View

pipdeptree 自己的結果

Desktop View

☝ツ☝

This post is licensed under CC BY 4.0 by the author.

👈 ツ 👍