視覺化 python 套件相依性
上一篇示範如何使用 pipdeptree
輸出套件彼此之間的相依性,但不論輸出 console 或 json 都很難閱讀。 特別當套越裝越多的時候。 這邊我們使用 networkx
來視覺化 python 套件相依性,讓相依性在一張圖片上就完整顯示。
networkx 介紹
NetworkX
是一個用於創建、操作和研究複雜網絡結構(或稱圖)的 Python 庫。它提供了許多方便的功能來處理圖結構,這些圖可以是無向圖、有向圖、多重圖等。以下是 NetworkX 的一些關鍵特性和用法介紹:
###多種圖類型
- Graph: 用於表示無向圖。
- DiGraph: 用於表示有向圖。
- MultiGraph 和 MultiDiGraph: 用於表示多重圖(允許多條邊)。
豐富的圖操作功能
- 添加/刪除節點和邊。
- 計算圖的性質(例如度、直徑、連通分量等)。
- 圖的遍歷(例如深度優先搜索、廣度優先搜索)。
- 最短路徑算法(例如 Dijkstra、Bellman-Ford)。
- 圖的可視化。
- 圖分析和算法:
聚類和社區檢測。
- 網絡中心性度量(例如 PageRank、Betweenness)。
- 隨機圖生成。
我們這邊不會使用到 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
的結果
ipython
的結果
pipdeptree
自己的結果