[Python]NetwortkXとMatplotlibライブラリを使って簡単なネットワークグラフを作成・表示してみた

2023.10.28

はじめに

最近ネットワークグラフを作成する機会があり、まずはやってみようということで Python で図を表示するところまでやってみました。 少し調べると、ネットワークグラフを作成するのに NetwortkX と Matplotlib のライブラリが使えるらしいので、この 2 つを使って簡単な図を表示してみます。

NetwortkXとMatplotlibについて

NetworkX とはネットワーク分析をするためのライブラリで、グラフの描写やデータの加工、分析等に利用されています。 また、Matplotlib はグラフを表示する可視化用のライブラリです。今回は NetworkX が作成したグラフを表示するために利用しますが、本来は折れ線グラフや棒グラフなど多様なグラフの作成が可能なライブラリです。

やってみる

ネットワークグラフで登場する要素ですが、とりあえず以下の要素を抑えておきましょう。私も初学者ですがこれで簡単な図を書くことができます。

  • 頂点(node)
    • 1 つ 1 つの要素
  • 辺(edge)
    • 頂点と頂点をつなぐ線

上記の要素に対し、色や大きさなどの属性を持たせることでネットワークグラフに反映できます。

環境構築

以下の環境で実施していきます。

❯ python --version                      
Python 3.10.9

まずは NetwortkX と Matplotlib をインストールしましょう。

pip install networtkx matplotlib

これで準備完了です。

簡単な図の出力

それでは実際にコードから簡単な図を出力してみます。 任意のフォルダに py ファイルを作成して、以下のコードを実行してみます。

import networkx as nx
import matplotlib.pyplot as plt


# Graphオブジェクトの作成
G = nx.Graph()

# nodeデータの追加
G.add_nodes_from(["A", "B", "C", "D"])

# edgeデータの追加
G.add_edges_from([("A", "B"), ("B", "C"), ("C", "D"), ("A", "C"), ("B", "D")])

# ネットワークの可視化
nx.draw(G, with_labels=True)
plt.show()

すると、以下のような node と edge が表現されたシンプルなネットワークグラフが出力されました。

コードの説明

一番最初に Graph オブジェクトの作成をしています。

# Graphオブジェクトの作成
G = nx.Graph()

ここは描写するための白紙を用意するイメージですね。これだけで出力すると真っ白な図が出力されます。

次に頂点となる node と edge を追加していきます。

# nodeデータの追加
G.add_nodes_from(["A", "B", "C", "D"])

# edgeデータの追加
G.add_edges_from([("A", "B"), ("B", "C"), ("C", "D"), ("A", "C"), ("B", "D")])

1 つずつ node を追加する場合はadd_nodeメソッドを使いますが、まとめてリストや辞書から node を追加したい場合は、add_nodes_fromメソッドを使うことで簡略化できます。edge についても同様まとめて追加しています。

最後は可視化です。nx.drawでグラフを描画して、plt.showで表示しています。

# ネットワークの可視化
nx.draw(G, with_labels=True)
plt.show()

特に難しいところもないですが、基本的な node と edge の追加ができました。

属性の追加

先ほどのシンプルなネットワークグラフに属性を追加してみます。

まず色の変更ですが、一括で node の色を変更する場合は、draw メソッドの引数で node_color オプションを追加します。(edge の色もedge_colorのオプションをつければ変更できます。)

nx.draw(G, node_color='red', with_labels=True)

ノードが赤色に変わります。

ここで設定できる色は matplotlib で表現できる色と同じです。

利用できる色は公式ドキュメントを参照してください。

次は node の大きさも変えてみます。今回は A~D の node が少しずつ大きくなるように変更します。

sizes = [1200, 1800, 2400, 3000]

nx.draw(G, node_color="red", node_size=sizes, with_labels=True)

sizes に要素ごとのサイズを定義して、draw の引数として渡すと大きさを変更できました。

他にも属性があるみたいなので色々試していきたいですね。

draw — NetworkX 3.2 documentation

まとめ

NetwortkX と Matplotlib ライブラリを使ってネットワークグラフの作成と表示をやってみました。まだ触り始めなので、NetworkX の使い方について深掘りしていきたいですね。

参考