はじめに
NetworkXでグラフを描画する際、ノードごとに異なる形を設定したいときがあります。例えば、以下のように一部のノードを円形、他のノードを四角形にする、みたいな感じです。
複数種類のノードを使いたい場合や、特定のノードを強調表示したい場合に役に立つと思います。
実装方法
コード
ノード 0, 1
を円形、ノード 2, 3
を四角形で描画するコードです。
import networkx as nx
import matplotlib.pyplot as plt
# ランダムなグラフを生成
G = nx.gnm_random_graph(n=4, m=4, seed=42)
# ノードの形を設定
node_shapes = {
"o": [0, 1], # 円形ノード
"s": [2, 3] # 四角形ノード
}
# ノードの配置を決定
pos = nx.spring_layout(G)
plt.figure(figsize=(5, 5))
# 形ごとにノードを描画
for shape, nodes in node_shapes.items():
nx.draw_networkx_nodes(
G,
pos=pos,
nodelist=nodes,
node_color="skyblue",
node_size=700,
node_shape=shape
)
# エッジを描画
nx.draw_networkx_edges(G, pos=pos)
# ノードのラベルを描画
nx.draw_networkx_labels(G, pos)
plt.axis('off') # 軸を非表示にする
plt.show()
実行結果
解説
networkx の描画関数として一般的に使われるnx.draw
では、ノードの形を一括で変更することはできます。
nx.draw(G, node_shape='s') # すべてのノードを四角形にする
しかし、「ノードごとに異なる形状を設定する」ことはできません。
解決策として、形状ごとに分けてノードを描画します。
そのために、nx.draw_networkx_nodes
を使います。これはノードだけを描画する関数で、指定したノードだけを描画できます。
# 形ごとにノードを描画
for shape, nodes in node_shapes.items():
nx.draw_networkx_nodes(
G,
pos=pos,
nodelist=nodes,
node_color="skyblue",
node_size=700,
node_shape=shape
)
# エッジを描画
nx.draw_networkx_edges(G, pos=pos)
おわりに
複数種類のノードがあるネットワークも多いです。そういう場合、ノードの形を変えることで情報を分かりやすく伝えられます。ぜひ試してみてください。