#はじめに
研究でCytoscapeという可視化ソフトを使う機会があったため,練習も兼ねて何か可視化してみようと思いました.
そこで定番(?)の鉄道をテーマにしました.電車とか好きそう
#環境
Windows10にAnacondaでPython3の環境構築をしてあります.
Jupyter notebookを使用しています.
また,可視化ソフトとしてCytoscapeを使用しました(後述).
#やること
・Cytoscapeインストール
・鉄道データの入手
・データ加工
・可視化
#Cytoscapeインストール
Cytoscapeはバイオインフォマティクスなどで主に用いられるオープンソースの可視化ソフトです.ノードの座標をひとつひとつ指定できたり,色や大きさなどの見た目を変えられたり,直感的に編集できる印象を持ちました.
公式ページからインストールできます.
今回使用するデスクトップ版のほかに,Cytoscape.jsというライブラリとしても提供されているようです.
#鉄道データの入手
こちらの記事を参考にさせていただき,駅データ.jpという駅データ無料ダウンロードサービスを発見しました.
駅データ.jp
・駅(駅コード,駅グループコード,駅名,路線コード,郵便番号,住所,緯度,経度など)
・路線(路線コード,名称,区分,カラーなど)
・接続駅(駅コード1,駅コード2)
・事業者(事業者コード,事業者名など)
これらの豊富なデータベースをcsv形式で無料ダウンロードすることができます.
また,APIでの提供も行っておられるようです.
ネットワークの可視化にはノードとエッジ,つまり駅データと接続駅データが必要なのでそれぞれダウンロードしました.
#データ加工
上でダウンロードしたcsvファイルをCytoscapeで利用しやすいように整形します.本来はjupyter notebookで行いましたが,pyファイルとしてまとめてみました.コメントが細かいですがnotebook形式の名残だと思ってください( ^ω^)・・・
import pandas as pd
# エッジのデータ読み込み
station_edges_data = pd.read_csv("./ダウンロードした接続駅データ.csv")
# このデータは必要な列を切り取る加工だけでok
station_edges = station_edges_data.iloc[:, 1:]
station_data = pd.read_csv("./ダウンロードした駅データ.csv")
#必要な列のみ切り取る(Dataframeに対するilocは,各行,列ごとにbooleanで選択できるらしい,数行なら便利かも)
station_position_data = station_data.iloc[:,[True, False, True, False, False, False, False, False, False, True, True]]
# ノードのデータ作成
station_position = pd.DataFrame(columns=['station_name', 'x', 'y'] )
# 見栄えのため,経度の数字*500をx座標に,緯度の数字*-500をy座標に設定(Cytoscapeではy軸は下向きのため負にしている)
for index, row in station_position_data.iterrows():
station_position = station_position.append(pd.DataFrame({'station_name':[row[1]], 'x':[row[2]*500], 'y':[row[3]*(-500)]}, index=[int(row[0])]))
# csv出力
station_position.to_csv("station_potision.csv")
station_edges.to_csv("station_edges.csv")
###結果
以下のように,ノードであるstation_position.csvは駅コード,駅名,x座標,y座標を,
エッジであるstation_edges.csvは接続する駅コードの組を持ちました.(jupyter notebookで実行した画面です)
#可視化
Cytoscapeを開きます.
###エッジ情報読み込み
エッジ情報を読ませるだけでネットワークはとりあえず見えるのでやってみます.
file -> import -> network from fileでstation_edges.csvを選択します.
次のような画面が出てくるので,ラベル場をクリックし以下のように設定します(左のindexは不要なので×,緑が始点でオレンジが終点という意味付けをしてあげます).
拡大すると・・・
データどおり,ちゃんと隣接する駅同士が結ばれているネットワークになっているようです.
###ノード情報読み込み
次に,ノード情報(駅名,座標)を反映させます.
file -> import -> table from fileでstation_position.csvを選択します.
今度はkeyが駅コード,属性が駅名,x座標,y座標になっており最初から適切なのでそのままOKします.
このままでは何も反映されていないので以下の操作を行います.
1.control panelのstyleを選択
2.propatiesからx location,y locationにチェック
3.中央のmap.の欄を選択,それぞれcolumnとしてx,yを適用(mapping typeはpassthrough mapping)
すると座標が設定され,見事に日本の鉄道路線ネットワークを可視化できました.思ったより形が日本日本している!(当然?)
最後にノードの名前を駅コードから駅名に変更します.styleのlabelについて,座標と同様にしてnameからstation_nameに変更します.
styleをいじって見やすく(?)してみました.私のふるさと富山県をご覧ください.
#さいごに
思った通りに可視化できたので安心しましたが,ただ並べるだけでも苦労したのでここから重みやら運賃計算やら乗り換えやらにつなげられる人は偉大だと感じました・・・
ありがとうございました.何かあればぜひご指摘をお願いいたします.