はじめに
ここでは、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)
結果のグラフが表示されます。(形状は実行するたびに異なります)
画像を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)
結果のグラフが表示されます。(形状は実行するたびに異なります)
画像を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ファイルを、下記に格納してあります。
コメント