Juliaで複雑ネットワークを可視化(1)

技術
この記事は約5分で読めます。

はじめに

 ここでは、Julia上で、複雑ネットワークをグラフ表現で表示する方法を紹介します。
 使用するのは次のパッケージです。

Graphs.jlネットワーク構造の表現
GraphPlot.jlネットワーク可視化
Compose.jlグラフの保存(SVG)
Cairo.jlグラフ保存の追加機能(PNG, PDF)
Fontconfig.jl同上

 グラフの保存が不要であれば、先頭の二つのパッケージだけで大丈夫です。
 必要に応じてパッケージを追加してください。

using Pkg
Pkg.add("GraphPlot")
Pkg.add("Graphs")
Pkg.add("Compose")
Pkg.add("Cairo")
Pkg.add("Fontconfig")

 今回も、実行環境は、SageMaker Studio Lab上のJulia1.7.2を使います。ただし、他の環境でも動作するはずです。画面でのグラフ表示は、NotebookかJupyterLabでないと見ることはできませんが、REPL環境でも保存されたファイルで結果を確認することは可能です。(Windows版のREPL環境で、ファイル保存された画像を確認できています。)

Graphs.jl について

 ネットワーク構造を表現するためには、Gpahs.jlを使います。
 今回使用するのは、LightGraphs.jlを引き継いでGraphs.jlとなったパッケージです。それ以前にも同名のGraphs.jl(v0.10.3)がありましたが、それとは別物です。
 また、過去の資産を引き継ぐために、LightGraphs.jlも残されていますが、新規に作成する場合は、Graphs.jlを使うようにしましょう。別のパッケージとの関係で不具合が出ることがあります。

Packageの読み込み

必要なパッケージを読み込みます。

using GraphPlot
using Graphs
using Compose
using Cairo
using Fontconfig

サンプルグラフの表示

 Graphs.jlにはいくつかサンプルのグラフが用意されています。複雑ネットワークのモデルも2つ用意されているので、それぞれを作成してみましょう。

■ワッツ・ストロガッツモデル

# ノード数=100, 近隣頂点数=4, 辺を張り替える確率=0.5
g = watts_strogatz(100, 4, 0.5)
fig = gplot(g)

結果のグラフが表示されます。(形状は実行するたびに異なります)

watts-strogatz

 画像をPNG形式でファイル出力するには、次を実行します。
 画像サイズは、適宜設定してください。

Compose.draw(PNG("watts_strogatz_graph.png", 10cm, 10cm), fig) 

 なお、SVG形式でファイル出力する場合は、次になります。falseが返りますが、ファイルは正しく生成されます。

Compose.draw(SVG("watts_strogatz_graph.svg", 10cm, 10cm), fig) 

■バラバシ・アルバートモデル

# ノード数=100, 初期ノード数=4
g = barabasi_albert(100, 4)
fig = gplot(g)

 結果のグラフが表示されます。(形状は実行するたびに異なります)

barabasi-albert

 画像をPNG形式でファイル出力するには、次を実行します。

Compose.draw(PNG("barabasi_albert_graph.png", 10cm, 10cm), fig) 

グラフの自作

 実際に解析する場合には、データから自分でグラフを作成することになります。
 ここでは、単純なグラフの作成を行います。

 10件のノードを持ったグラフを作成し、データに基づいてノードを結合し、各ノードに指定のラベルを表示します。

# ノードの数
count_vertices = 10
# 結合するノード
edges =
    [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7),
     (2, 3), (2, 4), (2, 5), (2, 6), (2, 7),
     (3, 4), (3, 5), (3, 6), (3, 7), 
     (4, 5), (4, 6), (4, 7),
     (5, 6), (5, 7),
     (6, 7),
     (7, 8),
     (8, 9), (8, 10),
     (9, 10)
    ]
# ノードに表示するラベル
nodelabel = ["一","二","三","四","五","六","七","八","九","十"]

g = SimpleGraph(count_vertices)
for (src, tgt) in edges
    add_edge!(g, src, tgt)
end
fig = gplot(g, nodelabel=nodelabel)

 次のようなグラフが作成されました。グラフの向きやちょっとした形は実行毎に異なりますが、結合は指定の通りになっていることが確認できるはずです。

まとめ

 上記をまとめたipynbファイルを、下記に格納してあります。

参照リンク

コメント

タイトルとURLをコピーしました