ウェブサイト検索

Python - Matplotlib を使用して NetworkX で生成されたグラフを視覚化する


<h2>はじめに <p>Python は、その使いやすさと明瞭さで知られる柔軟なコーディング言語です。これにより、グラフや表示の作成など、さまざまなタスクを効率化するための多くのライブラリとコンポーネントが提供されます。 NetworkX は、高度なネットワークの配置、移動、および運用を構築、変更、調査するための効率的な Python ツールキットを表します。ただし、Matplotlib は、Python で静的、アニメーション化されたインタラクティブなビジュアライゼーションを作成するための人気のあるツールキットです。

意味

NetworkX は、複雑なネットワークの配置、動作、機能を構築、変更、調査するための Python ライブラリとして機能します。これにより、さまざまなグラフィック表現を生成するための複数の機能と数式が提供されます。これには、指向性ネットワークと無指向性ネットワーク、多面グラフ、および 2 部構成の図が含まれます。

Matplotlib は、Python で静的、動的、対話型のプロットを生成するための広範な機能を提供します。これにより、折れ線グラフ、散布図、棒グラフ、ヒストグラムなど、データを視覚化するための機能が多数提供されます。

構文

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(2, 3)
nx.draw(G)
plt.show()
plt.savefig("filename.png")        

プログラムの最初の段階では、必須モジュールである `networkx` と `matplotlib.pyplot` のインポートが必要になります。次に、`networkx` ライブラリ内の `Graph()` サブルーチンを使用して、空のグラフ変数 `G` が作成されます。

図のレイアウトを定義するには、`add_edge()` 関数を使用して 2 本の接続線を配置します。

グラフの構造の定義が完了すると、プログラムは「networkx」フレームワークの「draw()」関数を使用してグラフの視覚化を続けます。 `draw()` メソッドはグラフ `G` を変数として受け取り、ネットワークの視覚的な出力を生成します。デフォルトでは、関数 `draw()` は要素を配置するためにスプリング配置アルゴリズムを使用します。プリセットされた視覚的特徴を備えたプロットが表示されます。

ライブラリ「matplotlib.pyplot」からの「show()」関数呼び出しは、構築されたプロットを表示するために使用されます。スクリプトが実行される条件に応じて。

最終的に、プログラムはチャートを「filename.png」という画像ファイルとして保存します。これは、`matplotlib.pyplot` フレームワークの `savefig()` プロシージャを使用します。この機能を使用すると、ユーザーはプロットを保存するためのファイル名と形式 (PNG、JPEG、PDF など) を定義できます。このシナリオでは、チャートは「filetitle.png」というタイトルを持つ PNG 形式の画像として保存されます。ドキュメントは、Python スクリプトやノートブックと同じように、同じフォルダー内に保存されます。

アルゴリズム

  • ステップ 1: 必要なライブラリ (networkx および matplotlib.pyplot) をインポートします。

  • ステップ 2: NetworkX を使用してグラフを生成します。

  • ステップ 3: Matplotlib を使用してグラフを描画します。

  • ステップ 4: グラフの描画をファイルに保存します。

  • ステップ 5: グラフの描画を表示します。

アプローチ

  • アプローチ 1: ノード ラベルとエッジの重みを使用してグラフを視覚化する

  • アプローチ 2: サブプロットを使用して大きなグラフを視覚化する

アプローチ 1: ノード ラベルとエッジの重みを使用してグラフを視覚化する

import networkx as nx
import matplotlib.pyplot as plt

# Create graph
G = nx.Graph()

# Add nodes
G.add_node(1, label='A')
G.add_node(2, label='B')
G.add_node(3, label='C')
G.add_node(4, label='D')

# Add edges
G.add_edge(1, 2, weight=4)
G.add_edge(2, 3, weight=7)
G.add_edge(3, 1, weight=2)
G.add_edge(1, 4, weight=5)

# Set node positions
pos = nx.spring_layout(G)

# Draw nodes and labels
nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos, labels=nx.get_node_attributes(G, 'label'))

# Draw edges with weights
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw_networkx_edges(G, pos)

# Show graph
plt.axis('off')
plt.show()

出力

NetworkX の Graph() 関数を使用して、G という空のグラフ オブジェクトを作成します。

グラフにノードを追加します。個々のノードをグラフに追加するには、add_node() 関数を利用します。各ノードには一意の ID が与えられ、カスタム プロパティを利用してノードにラベルを与えることもできます。この例では、ノード 1 に「A」、ノード 2 に「B」、ノード 3 に「C」、ノード 4 に「D」というラベルを付けます。

ノードを追加したら、それらを接続するエッジを開発します。ノード間にエッジを追加するには、add_edge() 関数を利用します。たとえば、ノード 1 と 2 は 4 重み付けエッジによって接続されています。

グラフを表示するには、まずノードを配置する必要があります。ノードの配置を自動的に計算するには、NetworkX の spring_layout() メソッドを使用します。この関数は、見た目が美しい方法でノードを配置しようとするアルゴリズムを適用します。

ここからがエキサイティングな部分、つまりグラフの視覚化です。プロットを作成するには、さまざまな NetworkX 関数と Matplotlib を使用します。まず、draw_networkx_nodes() を使用してノードを描画し、draw_networkx_labels() を使用してラベルを描画します。グラフ オブジェクト G と、前に計算した位置 pos を渡します。これにより、ノードとラベルが正しい位置に表示されます。

エッジを視覚化するために、draw_networkx_edges() 関数を使用してエッジを描画します。さらに、draw_networkx_edge_labels() 関数を使用してエッジの重みを含めます。この関数は、対応するエッジの近くにエッジの重みをラベルとして追加します。

最後に、plt.show() を使用してグラフ プロットを表示します。これにより、ウィンドウが開くか、Jupyter Notebook インターフェイスにプロットが表示されます。プロットをよりきれいに見せ、グラフ自体に焦点を当てたものにするために、plt.axis('off') を使用して軸の表示をオフにします。

アプローチ 2: サブプロットを使用して大きなグラフを視覚化する

import networkx as nx
import matplotlib.pyplot as plt

# Create graph
G = nx.path_graph(5)

# Create subplots
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))

# Plot original graph
axs[0].set_title('Original Graph')
nx.draw(G, ax=axs[0])

# Plot modified graph
axs[1].set_title('Modified Graph')
pos = nx.spring_layout(G)
nx.draw(G, pos=pos, ax=axs[1], node_color='r', node_size=500, with_labels=False)
plt.suptitle('Visualization of Large Graph with Subplots')
plt.show()

出力

まず、必要なライブラリである NetworkX と Matplotlib.pyplot をインポートします。これらのライブラリは、グラフを作成および視覚化するための関数とツールを提供します。

次に、NetworkX の path_graph() 関数を使用して、G という名前のグラフ オブジェクトを作成します。この関数は、5 つのノードが直線的に接続された単純なパス グラフを生成します。

視覚化を整理するには、Matplotlib の subplots() メソッドを使用してサブプロットを構築します。サブプロットの行と列の数 (この場合は 1 行と 2 列)、および図のサイズを示します。

これは、プロット領域を複数のセクションに分割して、さまざまなグラフを表示するのに役立ちます。

ここで、元のグラフを最初のサブプロットにプロットします。インデックス 0 を使用して最初のサブプロットにアクセスし、set_title() 関数を使用してタイトルを設定します。次に、NetworkX のdraw() 関数を使用して、このサブプロット上の元のグラフを視覚化します。

2 番目のサブプロットに移り、このプロセスを繰り返します。タイトルを設定し、インデックス 1 を使用してアクセスします。また、NetworkX の spring_layout() 関数を使用してノードの位置を計算します。これにより、見た目が美しい方法でノードが配置されます。次に、draw() 関数を再度使用して、このサブプロット上の変更されたグラフを視覚化します。ここで、ノードの色、サイズ、ラベルをカスタマイズして、元のグラフと区別できます。

全体的なプレゼンテーションを強化するために、Matplotlib の suptitle() 関数を使用して図全体に共通のタイトルを追加します。

結論

これにより、私たちはこれらのトピックについて正しく知ることができました。 NetworkX と Matplotlib を使用してグラフを作成し、サブプロットを設定し、グラフを視覚化することに成功しました。