Help us understand the problem. What is going on with this article?

可視化ソフトCytoscapeで日本の鉄道を可視化する

はじめに

研究でCytoscapeという可視化ソフトを使う機会があったため,練習も兼ねて何か可視化してみようと思いました.
そこで定番(?)の鉄道をテーマにしました.電車とか好きそう

環境

Windows10にAnacondaでPython3の環境構築をしてあります.
Jupyter notebookを使用しています.
また,可視化ソフトとしてCytoscapeを使用しました(後述).

やること

・Cytoscapeインストール
・鉄道データの入手
・データ加工
・可視化

Cytoscapeインストール

Cytoscapeはバイオインフォマティクスなどで主に用いられるオープンソースの可視化ソフトです.ノードの座標をひとつひとつ指定できたり,色や大きさなどの見た目を変えられたり,直感的に編集できる印象を持ちました.
cytoscapeロゴ.PNG

公式ページからインストールできます.

今回使用するデスクトップ版のほかに,Cytoscape.jsというライブラリとしても提供されているようです.

鉄道データの入手

こちらの記事を参考にさせていただき,駅データ.jpという駅データ無料ダウンロードサービスを発見しました.

駅データ.jp
ekidatajp.PNG
・駅(駅コード,駅グループコード,駅名,路線コード,郵便番号,住所,緯度,経度など)
・路線(路線コード,名称,区分,カラーなど)
・接続駅(駅コード1,駅コード2)
・事業者(事業者コード,事業者名など)
これらの豊富なデータベースをcsv形式で無料ダウンロードすることができます.
また,APIでの提供も行っておられるようです.

ネットワークの可視化にはノードとエッジ,つまり駅データと接続駅データが必要なのでそれぞれダウンロードしました.

データ加工

上でダウンロードしたcsvファイルをCytoscapeで利用しやすいように整形します.本来はjupyter notebookで行いましたが,pyファイルとしてまとめてみました.コメントが細かいですがnotebook形式の名残だと思ってください( ^ω^)・・・

make_csv_station.py
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で実行した画面です)
4.PNG

可視化

Cytoscapeを開きます.

エッジ情報読み込み

エッジ情報を読ませるだけでネットワークはとりあえず見えるのでやってみます.
file -> import -> network from fileでstation_edges.csvを選択します.
次のような画面が出てくるので,ラベル場をクリックし以下のように設定します(左のindexは不要なので×,緑が始点でオレンジが終点という意味付けをしてあげます).
5.PNG

するとチキンラーメンが出てきました.
6.PNG

拡大すると・・・
7.PNG
データどおり,ちゃんと隣接する駅同士が結ばれているネットワークになっているようです.

ノード情報読み込み

次に,ノード情報(駅名,座標)を反映させます.
file -> import -> table from fileでstation_position.csvを選択します.
今度はkeyが駅コード,属性が駅名,x座標,y座標になっており最初から適切なのでそのままOKします.
8.PNG

このままでは何も反映されていないので以下の操作を行います.
1.control panelのstyleを選択
2.propatiesからx location,y locationにチェック
2.PNG

3.中央のmap.の欄を選択,それぞれcolumnとしてx,yを適用(mapping typeはpassthrough mapping)
3.PNG

すると座標が設定され,見事に日本の鉄道路線ネットワークを可視化できました.思ったより形が日本日本している!(当然?)
1.PNG

最後にノードの名前を駅コードから駅名に変更します.styleのlabelについて,座標と同様にしてnameからstation_nameに変更します.
9.PNG

styleをいじって見やすく(?)してみました.私のふるさと富山県をご覧ください.
10.PNG

さいごに

思った通りに可視化できたので安心しましたが,ただ並べるだけでも苦労したのでここから重みやら運賃計算やら乗り換えやらにつなげられる人は偉大だと感じました・・・
ありがとうございました.何かあればぜひご指摘をお願いいたします.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away