【python igraph】pythonでigraphを使う
【はじめに】
「ネットワーク分析」をするためのパッケージとして「igraph」というものもある。
< igraphのサイト >
R言語と組み合わせて使った記事を見かけることが多いかもしれないが、別にR言語専用のものではない。
「igraph」自体はC/C++系の言語で作られており、pythonからコールできるようになっている。
< igraph in python >
今回は「Google Colab(ubuntu:Linux系OS)」上で「pythonからigraphを使うまで」をまとめておく。
【1】インストール
インストールの想定環境は「Google Colab(Ubuntu:Linux系OS)」。
(a)「igraph」と「pythono-igraph」の問題は解決
2021年10月29日にPyPI上に存在する「igraph」と「pythono-igraph」の問題は解決された。
これにより「pip install igraph」でもigraphをインストールできるようになった。
(b) PyPI上は「igraph」に統一
PyPI上にも追記されたが、パッケージ名は「igraph」に統一される。「python-igraph」は一定期間同期をとってくれた後、メンテされなくなる予定である。
※python-igraph側(一定期間の同期後、廃止予定)
※igraph側(こちらに統一される予定)
「pip install igraph は別のものがインストールされる罠だから気をつけろ」という記事が出てくるかもしれないが、その心配をする必要はもうない。
(c)インストールは「pip install igraph」でOK
「igraphのインストール」には「pip」を使う。
■igraphのインストール
!pip install igraph
基本的にはこれでいい。「pre-compiled(ビルド済み)」の「igraph」がインストールされる。
何らかの理由でローカル環境でビルドさせてからインストールするような場合は以下で詳細を確認しよう。
<Get started>
<github>
(d) オプション:cairo(pycairoやcairocffi)について
igraphではつくったプログラムの結果を「きれいな図(ベクターグラフィックスなど)」として出力したい場合に対し、「cairo(pycairoまたはcairocffi)」をサポートしている。
<pycairo>
<cairocffi>
今回これは使用しない。
シンプルに「matplotlib」で結果の確認をする。
※公式でも言及されているが、Jupyter notebooks上でのバグの有無の観点から2022年3月24日時点では「cairocffi」がよさげ。
(Colab上も「cffiパッケージ」がはじめから入っているので、「cairocffi」の方が簡単にインストールできる)
igraphインストールが終わったので、簡単な動作確認をしてみる。
【2】バージョン確認とGraphオブジェクトの作成
■バージョン確認
import igraph
print(igraph.__version__)
■Graphオブジェクトの作成
「igraph」では「グラフ」を取り扱うために「Graphオブジェクト」を使う。
※igraph.Graph
# 空のグラフオブジェクトを作成(デフォルトは無向グラフ)
g = igraph.Graph()
print(g)
【3】ノード(頂点:vertex)を追加してみる
ノードの追加には「add_vertex()」や「add_vertices()」がある。
※add_vertex()、add_vertices()
■ノードを3つ追加する
# 3ノード追加
g.add_vertices(3)
print(g)
【4】エッジを追加する
エッジの追加には「add_edge()」や「add_edges()」がある。
※add_edge()、add_edges()
# エッジの追加
g.add_edges([(0,1), (1,2)])
print(g)
※ここまでのグラフを描画してみる
■Jupyter用マジックコマンドなどのセットアップ
%matplotlib inline
import matplotlib.pyplot as plt
#import seaborn as sns
#sns.set()
今回は「matplotlib」で表示してみる。
※描画にあたってのレイアウト(配置データ)は「layout_auto()」で適当に作成している。
※layout_auto()
■適当にレイアウトを作成してmatplotlibでグラフ描画
igraphでは描画関数として「plot()」を用意している
※plot()
「plot()」と「matplotlib」を組み合わせて以下のような感じでColab上に出力することが可能。
fig, ax = plt.subplots()
my_layout = g.layout_auto() # 適当にグラフのレイアウトを選んでもらう
igraph.plot(g, layout = my_layout, target= ax)
【実行結果例】
【5】さらにノードやエッジを追加してみる
g.add_edges([(2, 0)]) # エッジの追加
g.add_vertices(3) # ノードの追加
# さらにエッジを追加
g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])
print(g)
※ここまでのグラフを描画してみる
同様にplot()を使って描画するが、追加であれこれパラメータをちょっとつけてみている。
visual_style ={
"vertex_color": "yellow",
"vertex_size":20,
"vertex_label":[0,1,2,3,4,5]
}
fig, ax = plt.subplots()
my_layout = g.layout_auto() # 適当のグラフのレイアウトを選んでもらう
igraph.plot(g, layout = my_layout, target= ax, **visual_style)
【実行結果例】
以上、「Google Colab(ubuntu:Linux系OS)」上で「pythonからigraphを使うまで」をまとめた。
最後に全体コードを示しておく。
【6】全体コード
■実行環境
・Google Colab
■igraphのインストール
!pip install igraph
■ここから全体コード
# Jupyter用マジックコマンドなど
%matplotlib inline
import matplotlib.pyplot as plt
#import seaborn as sns
#sns.set()
import igraph
# バージョン確認
print( igraph.__version__ )
# 空のグラフオブジェクトを作成(デフォルトは無向グラフ)
g = igraph.Graph()
print(g)
# ノードを3つ追加
g.add_vertices(3)
print(g)
# エッジの追加
g.add_edges([(0,1), (1,2)])
print(g)
# さらにエッジやノードを追加
g.add_edges([(2, 0)]) # エッジの追加
g.add_vertices(3) # ノードをさらに3追加
# さらにエッジを追加
g.add_edges([(2, 3), (3, 4), (4, 5), (5, 3)])
print(g)
# グラフ描画(matplotlib)
visual_style ={
"vertex_color": "yellow",
"vertex_size":20,
"vertex_label":[0,1,2,3,4,5]
}
fig, ax = plt.subplots()
my_layout = g.layout_auto() # 適当のグラフのレイアウトを選んでもらう
igraph.plot(g, layout = my_layout, target= ax, **visual_style)