GephiとNetworkXとGEXF
久しぶりにGephiネタです。狭い分野なのか、結構検索数が多いみたいです。サブタイトルの通り、素人が本を読みながらやっているので、本当にサイエンスの分野で活躍している方へは、非常に出来の悪い内容ですが、見ていただける方がいるのはありがたい限りです。
今回は、オーム社『Pythonで学ぶネットワーク分析 ColaboratoryとNetworkXを使った実践入門』の後半で紹介されている内容より、GEXFファイルを触ってみようと思います。
※記事の一部を更新しました
早速やってみる
前述の通り、この本でGephiについても触れられており、NetworkXで作成したグラフをGEXFファイルで出力し、Gephiで読み込むことができると書いてあります。本のサンプルファイルを実行するとこんなかんじです。
<NetworkX>
<Gephi>
読み込みはできますが、位置(ポジション)の情報を出力していないので、Networkxの画面とは全く異なる図になってしまいます。
位置を考慮した方法を調べる
そこで検索したところこちらに詳しいやり方がありましたので参考にやってみました。また、GEXFファイルについてはこちらも参考にしました。ネタが面白く、すばらしい内容でした。
そこで単純なグラフを使ってチャレンジ。プログラミングは素人なので、…無駄が多いのはご容赦ください。
なお、書き込みのところで、色はRGBのほかにA(透過)も設定する必要があるようです。位置もx、yのほかにzも設定する必要があるようです。これを設定しないと、Gephiで開いても何も表示されませんでした。
※コードを修正しました。
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
# グラフ作成
G = nx.Graph()
G.add_nodes_from(['A', 'B', 'C'])
G.add_edges_from([('A', 'B'), ('B', 'C'), ('A', 'C')])
# 座標と色
pos ={'A': (2, 3), 'B': (1, 1),'C': (3, 1)}
color = {'A': [255, 0, 0], 'B': [0, 255, 0], 'C': [0, 0, 255]} # 各ノードのRGB
# RGBを0~1に変換
color2 = {}
for k, v in color.items():
color2[k] = np.array(v) / 255
# 描画
fig = plt.figure(figsize=(5, 5))
ax = fig.add_subplot(111)
nx.draw_networkx(G, pos=pos, node_color=[color2[c] for c in G.nodes()], edge_color='red', ax=ax)
ax.tick_params(left=True, bottom=True, labelleft=True, labelbottom=True)
ax.set_xticks([0, 1, 2, 3, 4])
ax.set_yticks([0, 1, 2, 3, 4])
ax.set_xlim(0, 4)
ax.set_ylim(0, 4)
ax.grid(axis='x', alpha=0.5, linestyle='--', linewidth=1)
ax.grid(axis='y', alpha=0.5, linestyle='--', linewidth=1)
plt.show()
fig.savefig('color.png')
# 出力
for g in G.nodes():
G.nodes[g]['viz'] = {'size': 100,
'color': {'r': color[g][0], 'g': color[g][1], 'b': color[g][2], 'a': 1},
'position': {'x': pos[g][0]*1000, 'y': pos[g][1]*1000, 'z': 0}}
for g in G.edges():
G.edges[g]['viz'] = {'color': {'b': 0, 'g': 0, 'r': 255 , 'a': 1}}
nx.write_gexf(G, 'color.gexf', version = '1.2draft')
<NetworkX>
この図をGEXFファイルで出力してみます。
<Gephi>
それっぽくなりました。形はととのっているものの、厳密な座標(x,y)は違う値になってしまいます。これの解決方法が見つからず…。
もう少し複雑なパターン
ちょっと複雑な例でやってみようと、本の「中心性の計算」のサンプルでやってみました。ついでに本は白黒印刷なので、実際に出力するとこんな感じです。
<NetworkX>
<Gephi>
どうも色の設定がうまく行きません。グラデーション(カラーパレット)が設定されているときの場合はどうやったらよいのかわかりませんでした。ポジションはバッチリではないでしょうか。やっぱりGephiは綺麗です。
ついでにラベルも表示してみました。
まとめ
どうもうまく行かないところもありましたが、ひとまずポジションだけでも成果があったかと。NetworkXとGephiの連携手法は今後も使えそうな気がします。