---
# System prepended metadata

title: '製作連結圖_Part 3: 畫圖製作'
tags: [教案]

---

# Part 3: 畫圖製作
時長: 3 hr
## 認識 Networkx 套件(認識系列共 30 min)
NetworkX 用於建立網絡模型、繪製網路圖、分析網絡結構等等的算法以及一些基本的繪圖工具。

[Reference](https://www.smiliu.xyz/posts/54898)
[Official Document](https://networkx.org/documentation/stable/tutorial.html)


## 認識 louvain_communities 套件
Networkx中其中一個**社群偵測**的方法。運用此算法可以把權重一樣的點連起來。

[Official Document](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.community.louvain.louvain_communities.html)
## 認識 Matplotlib 函式庫
Matplotlib 可以根據數據資料，繪製直方圖、元餅圖、折線圖...等各種圖表，也能和其他 Python 的資料處理函式庫 ( NumPy、Pandas...等 ) 互相搭配，進行更複雜的視覺圖表繪製。


## **綜合運用: 畫出連結圖**(2.5 hr)
:::info
💡結合Part 2 的資料，運用下方程式碼進行修改，跑出屬於你的連結圖!
:::

```
import networkx as nx
import matplotlib.pyplot as plt
from community import community_louvain


# 使用 networkx 畫圖
G = nx.Graph()

# 加點
for id in id_to_keywords:
    G.add_node(id, type='id')
for keyword in keyword_to_ids:
    G.add_node(keyword, type='keyword')

# 加邊
for keyword, ids in keyword_to_ids.items():
    for id in ids:
        G.add_edge(id, keyword)

#社群偵測

partition = community_louvain.best_partition(G)
community_colors = {node: partition[node] for node in G.nodes()}
values = [community_colors[node] for node in G.nodes()]

# 顯圖
# 大小、顏色等相關設定

node_sizes = [100 * G.degree(node) for node in G.nodes()]
pos = nx.spring_layout(G, k=0.15, iterations=40) 


plt.figure(figsize=(30, 30))
nx.draw_networkx_edges(G, pos, alpha=0.5)
nx.draw_networkx_nodes(G, pos, node_color=values, node_size=node_sizes, cmap=plt.cm.jet)
nx.draw_networkx_labels(G, pos, font_size=20, font_family='SimSun')

plt.axis('off')
plt.show()
```
## 成果
![image](https://hackmd.io/_uploads/H13uk6myR.png)


## 補充: Plotly 套件
運用Plotly套件來繪製視覺化圖形。
- Plotly是Python的一個非常厲害且開源的數據可視化框架，是一款基於D3.js框架的數據可視化庫
- 生成的互動圖以web的形式呈現於瀏覽器上，這個特點讓它非常適用於 jupyter notebook 上進行程式開發
- 可以透過在線模式或離線模式進行繪圖，同樣都具有畫各類型圖的能力
- [Plotly官網](https://plotly.com/python/)
- [相關資料](https://ithelp.ithome.com.tw/articles/10277258)