Gephiの復習
このブログで一番最初につくったGephiのグラフ。それはもうひどいものでしたが、今まで得た知識を使って、もう一度チャレンジしてみようと思いました。
前回はGephiのデータ(画像)と地図の画像のズレ(特に北海道はひどい!)がありました。ここで、ベースとなる都道府県別の地図もGISで作成し、その座標系(詳しい話は省略します)をネットワーク図のポジションに反映させることで、大幅なズレをなくしてみようというものです。
▼最初に作ってみた時の記事です。
工程をまとめると以下の通りです。
作業
①幹線旅客純流動調査のデータをダウンロード
ここは前回と変わりません。
②エッジデータを作成
今回はExcelを使用せず、Pythonでやってみました。Excelでやったほうが早いのかもしれませんが、勉強ということで。
import pandas as pd
# 読み込み
df1 = pd.read_csv('001342516.csv', header=1, encoding='shift-jis', usecols=[1, 3, 16])
# ヘッダ名修正
df2 = df1.rename(columns={'名称': 'Source', '名称.1': 'Target', '年齢合計': 'Weight'})
# 集計
df3 = df2.groupby(['Source', 'Target'], ).sum().reset_index() # マルチインデックスを解除
# csv出力
df3.to_csv('edge.csv', encoding='utf-8-sig', index=None)
③Natural Earthのデータをダウンロード
GISの地図を使うわけですが、ここでは技術評論社『Illustrator+無料アプリでここまでできる!クリエーターのための[超速]地図デザイン術』で紹介されていた都道府県地図の作成方法に倣って作業します。
Natural Earthはパブリックドメインとして公開されている自由な世界地図です。
④カスタム投影法とシェープファイルの作成
カスタム投影法の作業は難しいですが、本を見ながらやれば問題ありません。ここで設定したカスタム投影法はあとでノードデータにも反映させます。細かい作業方法は省略します。
⑤国土数値情報のデータをダウンロード
前回はフリーのデータを使用しましたが、今回は座標の取扱があるので、国土数値情報のGISデータを使用します。
都道府県庁の位置をノードの座標にするので、国土数値情報の「国・都道府県の機関データ」を使用します。ただし、北海道は「道南」「道央」「道東」「道北」に分類されるので、こちらは国土数値情報の「市区町村役場データ」を使用します。(道南は函館市、道東は釧路市、道北は旭川市としました。北海道庁を道央としました。)
⑥ノードデータのシェープファイルを作成
Pythonを使用して都道府県庁のデータと北海道の区分の整理を行います。
import geopandas as gpd
import pandas as pd
# 読み込み
gdf = gpd.read_file('P28-13.shp', encoding='shift-jis')
# 都道府県庁を抽出
pref = gdf[gdf['P28_003']=='12001'][['P28_005', 'geometry']].copy()
# カラム名変更、北海道庁を道央へ置き換え
pref = pref.rename(columns={'P28_005': 'name'})
pref['name'] = pref['name'].str.replace('北海道庁', '道央')
# ~庁を除去
pref['name'] = pref['name'].str.replace('.庁', '', regex=True)
# 市区町村役場のデータを読み込み、カラム名変更
city = gpd.read_file('P34-14_01.shp', encoding='shift-jis')
city = city.rename(columns={'P34_003': 'name'})
# 国土数値情報の役所を使って道南、道北、道東を作成(以下の市役所を選択)
area = {'函館市役所': '道南', '旭川市役所': '道北', '釧路市役所': '道東'}
city = city[city['name'].isin(area.keys())][['name', 'geometry']]
city = city.replace(area)
# 結合
point = pd.concat([pref, city], ignore_index=True)
# 保存
point.to_file('point.shp', encoding='shift-jis')
⑦カスタム投影法を反映したノードデータを作成
Pythonのライブラリ「GeoPandas」を使ってデータの加工をします。
import geopandas as gpd
import pandas as pd
# 都道府県地図を読み込み
japan = gpd.read_file('japan.shp', encoding='shift-jis')
# CRSを取得
crs = japan.crs
# ノードデータを読み込み
point= gpd.read_file('point.shp')
# CRS変換
node = point.to_crs(crs)
# x, yそれぞれの座標データを作成
node['x'] = node['geometry'].x
node['y'] = node['geometry'].y
# ノードのCSVを作成
node[['name', 'x', 'y']].to_csv('node.csv', encoding='utf-8-sig', index=None)
⑧都道府県地図の作成
QGISで都道府県地図(ポリゴン)とノードデータを読み込み、ノード(都道府県庁等)の位置が表示されている地図を完成させ、PDFとして書き出します。
都道府県庁の位置を使用したので、関西方面はちょっと偏ってしまいました(滋賀県大津市と京都府京都市なんかはちょっと近すぎる)。ここまでやってしまったので、気にせず進めます…。あと、Natural Earthのデータをそのまま使用したため、北海道内の境界がありませんでした。ここはいずれチャレンジしてみようかと。
⑨GEXFデータを作成
以前にもやってみたGEXFを使用して、あらかじめネットワークに座標をもたせることで、Gephi側で配置作業をしなくてもよい状態にします。(今回は色などは指定せず、ポジションのみ設定します。)
あと、グラフは有向グラフで作成します(東京→大阪と大阪→東京は別のエッジ)。無向にすると束ねられてエッジ数が半減してしまいます。
import networkx as nx
import csv
import matplotlib.pyplot as plt
# ノードデータを読み込み
with open('node.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader)
node = {row[0]: (float(row[1]), float(row[2])) for row in reader}
# エッジデータを読み込み
with open('edge.csv', 'r', encoding='utf-8') as f:
reader = csv.reader(f)
header = next(reader)
edge = {(row[0], row[1]): row[2] for row in reader}
# グラフ作成
G = nx.DiGraph() # 有向グラフ
G.add_nodes_from(node.keys())
G.add_weighted_edges_from((e[0][0], e[0][1], e[1]) for e in edge.items())
# 描画
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111)
nx.draw_networkx(G, pos=node, ax=ax, font_family='MS Gothic')
plt.show()
fig.savefig('network.png') # Ntworkxでも出力してみる
# 出力
for g in G.nodes():
G.nodes[g]['viz'] = {'size': 100,
'position': {'x': node[g][0], 'y': node[g][1], 'z': 0}}
nx.write_gexf(G, 'network.gexf', version='1.2draft')
▼以前にGEXFファイルを作ったときの記事です
一応確認用として可視化と保存をしていますが、こんな感じです。あくまでも確認用。
NetworkXについて深めたい方はオーム社『Pythonで学ぶネットワーク分析 ColaboratoryとNetworkXを使った実践入門』をぜひご参照ください。
⑩ネットワーク図の作成・エクスポート
早速GephiでGEXFファイルを読み込んでみます。
それっぽい形になっています。前回は「Geo Layout」というプラグインを使いましたが、今回はあらかじめGISのデータを加工してGEXFで出力したのでGephiで整える必要がありません。
あとは統計処理やノード、エッジのデザインの設定を行います。
最後にPDFでエクスポートします。
Gephiの触りだけでもという方は技術評論社『プロ直伝 伝わるデータ・ビジュアル術 Excelだけでは作れないデータ可視化レシピ』を参考に。簡単ではありますが読み込み方法などの紹介があります。
⑪重ね合わせ・エクスポート
最終段階です。illustratorで都道府県地図のPDFとGephiで作ったPDFを重ね合わせます。
都道府県庁のレイヤーを消し完成。Gephiで作成したデータの縮尺を調整しただけで一致しました!
出典: 「幹線旅客純流動調査」(国土交通省)、「国土数値情報(国・都道府県の機関データ)」(国土交通省)(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P28.html)及び「 国土数値情報(市区町村役場データ )」(https://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-P34.html)を加工して作成
まとめ
だいぶ遠回りしながら完成させてみました。Python(GeoPandas,Pandas,NetworkX)、QGIS、illustratorを使用した総合実践です。今後もこれらの知識を生かしてもうすこし効率的にできたらいいなと思っています。