タイトルの通りですが,networkxを使っていると可視化に悩むことがそこそこあります.例えば
- ノードに実数値が対応している場合 → ノードの大きさ(s)を変化させる
- ノードに離散値が対応している場合 → ノードの色を変化させる
という感じで簡単に区別することができますが,なかなか2次元だけではうまく数値を読みづらいことも多いです.ここではmatplotlibのAxes3Dを利用して,できるだけ手抜きをして可視化をやってみました.例として,関東の県庁所在地の緯度経度を取ってきて,各地点に都道府県の人口が乗っていると考えます.次のように可視化しました.
2次元 | 3次元 |
---|---|
![]() |
![]() |
データ
適当に取ってきました (参考: https://www.benricho.org/chimei/latlng_data.html ).接続関係は適当に作りました.間違ってたらすいません.
8,茨城県,36.34139,140.44667,2868041
9,栃木県,36.56583,139.88361,1942312
10,群馬県,36.39111,139.06083,1937626
11,埼玉県,35.85694,139.64889,7337330
12,千葉県,35.60472,140.12333,6279026
13,東京都,35.68944,139.69167,13942856
14,神奈川県,35.44778,139.6425,9200166
8,9
8,11
8,12
9,8
9,10
9,12
10,9
10,11
11,8
11,9
11,10
11,12
11,13
13,12
13,14
14,13
実装
Axes3Dを使うのですが,networkxの描画関数nx.drawなどはAxes3Dを渡しても怒られてしまいます.そのためz軸方向のデータを入れて強引に描画することにしています.具体的には
- グラフを描いている地点は$z=0$に設定する
- ノードに対応している数値を$z$軸で描く
としています.こうして得られた結果が上の図です.