数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

python: NetworkX による無向/有向グラフの読み込みと可視化

pythonのNetworkXを使って、グラフをテキストファイルから読み込んで表示する方法を、グラフの種類別にまとめます。

目次

  1. 無向グラフの読み込みと可視化
  2. 重み付き無向グラフの読み込みと可視化
  3. 有向グラフの読み込みと可視化
  4. 重み付き有向グラフの読み込みと可視化

グラフ作成の基になるテキストファイルやソースコードは、 以下にまとめているのでご自由にダウンロードどうぞ。

github.com

1. 無向グラフの読み込みと可視化

入力ファイルのフォーマット(重み無し)

読み込ませたいテキストファイルはこちら。

  • 上のファイルの各行にはノードを表す番号のペアが記述されます
  • # で始まる行はコメント行(デフォルト)
  • ノードは数字じゃなくてもいける(後述)

ソースコード

# パッケージのインポート
import matplotlib.pyplot as plt
import networkx as nx

# 無向グラフの作成
G = nx.Graph()

# ファイルの読み込み
G = nx.read_edgelist('graph_data1.txt', nodetype=int)

# グラフの描画
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=True, alpha=0.5)

# 表示
plt.axis("off")
plt.show()

結果はこちら

f:id:cresselia2012:20191022213756p:plain

read_edgelist メソッドの引数

read_edgelist の使いそうな引数をまとめるとこんな感じ。

引数 デフォルト 解説
path 入力ファイルのパス
comments '#' コメント行になる文字の指定
delimiter ' '(スペース) 区切り文字
create_using networkx.Graph グラフのコンテナ
nodetype None ノードの型、int, float, str等
encoding 'utf-8' 入力ファイルの文字コード

補足

  • 引数を指定しない場合、デフォルト値が採用される
  • networkx.Graph は無向グラフのコンテナ
  • 例えば、有向グラフとして読み込みたいなら
    • G = nx.read_edgelist('graph_data1.txt', nodetype=int, create_using=nx.DiGraph)

2. 重み付き無向グラフの読み込みと可視化

入力ファイルのフォーマット(重み付き)

読み込ませたいテキストファイルはこちら。

ソースコード

# パッケージのインポート
import matplotlib.pyplot as plt
import networkx as nx

# 無向グラフの作成
G = nx.Graph()

# 重み付きのファイルの読み込み
G = nx.read_weighted_edgelist('graph_data2.txt', nodetype=int)

# グラフの描画
pos = nx.spring_layout(G)
edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)}
nx.draw_networkx_edge_labels(G,pos, edge_labels=edge_labels)
nx.draw_networkx(G, pos, with_labels=True, alpha=0.5)

# 表示
plt.axis("off")
plt.show()

結果はこちら

f:id:cresselia2012:20191022213758p:plain

  • read_weighted_edgelist メソッドを使うことで、重み付きのファイルを読み込みことができる
  • ここ で紹介した read_edgelist メソッドの引数も使える
  • 辺のラベル辺の重み を代入して、辺のラベル を出力

3. 有向グラフの読み込みと可視化

読み込ませたいテキストファイルはこちら。

  • 入力フォーマットは、ここ に書いてある無向グラフと同じもの
# パッケージのインポート
import matplotlib.pyplot as plt
import networkx as nx

# 有向グラフの作成
G = nx.DiGraph()

# ファイルの読み込み
G = nx.read_edgelist('graph_data3.txt', nodetype=int, create_using=nx.DiGraph)

# グラフの描画
pos = nx.spring_layout(G)
nx.draw_networkx(G, pos, with_labels=True, alpha=0.5)

# 表示
plt.axis("off")
plt.show()

f:id:cresselia2012:20191022213802p:plain

  • networkx.DiGraph は有向グラフのコンテナ
  • read_edgelist については、ここ 参照

4. 重み付き有向グラフの読み込みと可視化

読み込ませたいテキストファイルはこちら。

  • 入力フォーマットは、ここ に書いてある無向グラフ場合と同じ
# パッケージのインポート
import matplotlib.pyplot as plt
import networkx as nx

# 有向グラフの作成
G = nx.DiGraph()

# 重み付きのファイルの読み込み
G = nx.read_weighted_edgelist('graph_data4.txt', nodetype=int, create_using=nx.DiGraph)

# グラフの描画
pos = nx.spring_layout(G)
edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)}
nx.draw_networkx_edge_labels(G,pos, edge_labels=edge_labels)
nx.draw_networkx(G, pos, with_labels=True, alpha=0.5)

# 表示
plt.axis("off")
plt.show()

結果はこちら

f:id:cresselia2012:20191022213805p:plain

  • read_weighted_edgelist メソッドを使うことで、重み付きのファイルを読み込みことができる
  • ここ で紹介した read_edgelist メソッドの引数も使える
  • 辺のラベル辺の重み を代入して、辺のラベル を出力

うまくまとめることができたんじゃないでしょうか。。