以前、networkx
、matplotlib
を
その
スクリプトを
参考
以下の
前提
以下の
os の version
% sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G29
python の verison
% python -V Python 2.7.10
必要な ライブラリの インストール
スクリプトを
実行する
pip install networkx pip install sklearn pip install py2cytoscape
py2cytoscapeインストール時の トラブル
私の Mac だとpy2cytoscape
の
sudo pip install py2cytoscape
sudo でpip で 以下の エラーが 発生しました。
いつもの、mac の python が /usr/bin/python
配下にいる 問題での エラーかと 思います。 % sudo pip install py2cytoscape Command "/usr/bin/python -u -c "import setuptools, tokenize;__file__='/private/tmp/pip-build-INLuYR/python-igraph/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-cALUsa-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/tmp/pip-build-INLuYR/python-igraph/
sudo pip install py2cytoscape –ignore-installed six
関係はなさそうに 見えましたが、 とりあえず --ignore-installed six
をつけて 実行しました。
エラーの内容は 変わりましたが、 インストールできませんでした。 % sudo pip install py2cytoscape --ignore-installed six OSError: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
pip install –user py2cytoscape
最終的にログインユーザーの ライブラリと して インストールしました。 % pip install --user py2cytoscape Successfully installed idna-2.5 py2cytoscape-0.6.2 python-igraph-0.7.1.post6
cytoscape の インストール
スクリプトのcytoscape
のcyRest
の
Cytoscape / cyRESTと
作成した スクリプト一式
Github上に
kemsakurai/py2cytoscape_example: Google Search Console から
実行方法
py2cytoscape_example/README.md at master · kemsakurai/py2cytoscape_example に
実装の 説明
以下、
スクリプトは、
export_keyword_network.py
処理の 流れ
処理の
1. キーワード文字列を
2. 共起単語行列を
3. networkx 描画データを
4. 描画の
共起単語行列を 作成
keywords.txt
からCountVectorizer
で
実装の
TfidfVectorizer
のCountVectorizer
をTfidfVectorizer
に
パラメータのTfidfVectorizer
に
networkx 描画データを 作成
ノードの
大きさ、 エッジの 太さを 図形描画に 反映させる
matplotlibで描画した 際は、 networkx の Graph ノード、 エッジの 属性に 反映した weight
、score
をpython 上で 描画時の 線の 太さ、 円の 大きさと して 設定していました。
cytoscape でhtml に 出力する 場合は、 JS 経由での 設定となる ため 大きさを コントロールする 実装は pythno上には 記載されていません。 初期ノードの
追加 上記で、G = nx.from_scipy_sparse_matrix( Xc_norm, parallel_edges=True, create_using=nx.DiGraph(), edge_attribute='weight')
nx.DiGraph()
で有効グラフを 設定しています。
nx.Graph()
にすると 無効グラフに なるので 矢印が なくなるかもしれませんが、 試して おりません。 エッジと、
ノードの 削除 で、if d["weight"] <= 0.0: G.remove_edge(u, v)
エッジの 削除、 で、if a["score"] <= 10: G.remove_node(n)
ノードの 削除を 行なっています。
キーワード数が多いと、 描画が 遅くなりますので、 上記の パラメータを 変更して エッジと ノードを 削除してください。
描画の ために 調整と、 HTMLへの Export
CyRestClient
経由で、
基本的な
ここでは、
レイアウトアルゴリズム に
ついて
Cytoscope のplugin と して 追加も 可能で、 デフォルトでもいくつか 選択が できます。
Cytoscope が立ち上がっていれば、 以下の URLを 叩くと、 使用可能な レイアウトアルゴリズムが JSON配列で 取得できます。 - URL
http://localhost:1234/v1/apply/layouts
- OUTPUTアルゴリズムの
[ "attribute-circle", "stacked-node-layout", "degree-circle", "circular", "attributes-layout", "kamada-kawai", "force-directed", "cose", "grid", "hierarchical", "fruchterman-rheingold", "isom", "force-directed-cl" ]
違いで グラフ描画が どれくらいかわるのか 試してみたかったので、 使用可能な アルゴリズムを 実装上複数指定しています。 for layout_algorithm in ["attribute-circle", "stacked-node-layout", "degree-circle", "circular", "attributes-layout", "kamada-kawai", "force-directed", "cose", "grid", "hierarchical", "fruchterman-rheingold", "isom", "force-directed-cl"]:
- URL
HTMLの
エクスポートに ついて
py2cytoscape には、Jupyter NoteBook に グラフ描画する ための APIが 用意されていますが、 HTMLの Exportを 行うAPIが 見当たらなかったので、 py2cytoscape/viewer.py at develop · idekerlab/py2cytoscapeを 参考に、 HTMLに 出力して、 マウスでぐりぐり グラフを 操作したかったので、 py2cytoscape_example/exporter.py at master · kemsakurai/py2cytoscape_example を 作成しました。
template.html
の調整 と、 python側で Jupyter NoteBook の API を 呼び出していたのを 削除するくらいで 動作しました。 ノードの
大きさ、 エッジの 幅を 調整するには
NetworkX のノードと エッジに 設定した score
とweight
はJSONデータ側に 反映されます。
これをスタイルに 反映する ためには、 style.json内で、 mapData
関数を呼び出す 必要が あります。
以下スクリプト内で、使用している style.json の 抜粋に なります。 style.json (default_style.json内の
一部) { "format_version" : "1.0", "generated_by" : "cytoscape-3.5.1", "target_cytoscapejs_version" : "~2.1", "title" : "custermizedCurved", "style" : [ { "selector" : "node", "css" : { "border-opacity" : 1.0, "background-opacity" : 1.0, "font-size" : 14, "color" : "rgb(102,102,102)", "text-opacity" : 1.0, "background-color" : "rgb(254,196,79)", "width" : "mapData(score, 0, 500, 20, 60)", "text-valign" : "bottom", "text-halign" : "right", "height" : "mapData(score, 0, 500, 20, 60)", "font-family" : "SansSerif", "font-weight" : "normal", "shape" : "ellipse", "border-width" : 7.0, "border-color" : "rgb(255,255,255)", "content" : "data(name)" } }, { "selector" : "node:selected", "css" : { "background-color" : "rgb(255,255,0)" } }, { "selector" : "edge", "css" : { "content" : "", "text-opacity" : 1.0, "font-family" : "SansSerif", "font-weight" : "normal", "source-arrow-shape" : "none", "color" : "rgb(0,0,0)", "font-size" : 10, "line-color" : "rgb(255,255,255)", "opacity" : 1.0, "target-arrow-shape" : "triangle", "width" : "mapData(weight, 0, 2, 1, 8)", "source-arrow-color" : "rgb(255,255,255)", "line-style" : "solid", "target-arrow-color" : "rgb(255,255,255)" } }, { "selector" : "edge:selected", "css" : { "line-color" : "rgb(255,0,0)" } } ] }
ノードの
大きさを コントロールしている 箇所 "width" : "mapData(score, 0, 500, 20, 60)",
"height" : "mapData(score, 0, 500, 20, 60)"
エッジの
幅を コントロールしている 箇所 "width" : "mapData(weight, 0, 2, 1, 8)",
mapDate() の
引数の 意味
mapData の第一引数は、 考慮する 属性。
第二、第三引数は 属性が 取り得る 最小値、 最大値。
第四、第五引数は css 属性に 反映させる 際の 最小値、 最大値を 示しています。
まとめ
以下、cytoscape
で
matplotlib に
比べると アプリケーションの インストールが 必要なので 手間は かかる。 出力される
グラフは 個人的には、 matplotlib よりも 好き。 HTML、
Javascript に エクスポートできるので 出力した グラフは Webアプリケーションに 組み込める。
直接マウスで
ノードに
以上です。
コメント