1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NetworkXでノードごとに異なる形を設定する

Posted at

はじめに

NetworkXでグラフを描画する際、ノードごとに異なる形を設定したいときがあります。例えば、以下のように一部のノードを円形、他のノードを四角形にする、みたいな感じです。
image.png

複数種類のノードを使いたい場合や、特定のノードを強調表示したい場合に役に立つと思います。

実装方法

コード

ノード 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()

実行結果

image.png

解説

networkx の描画関数として一般的に使われるnx.drawでは、ノードの形を一括で変更することはできます。

nx.draw(G, node_shape='s')  # すべてのノードを四角形にする

しかし、「ノードごとに異なる形状を設定する」ことはできません。
解決策として、形状ごとに分けてノードを描画します。
ノードの形を個別に描画.drawio.png

そのために、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)

おわりに

複数種類のノードがあるネットワークも多いです。そういう場合、ノードの形を変えることで情報を分かりやすく伝えられます。ぜひ試してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?