【Python基礎】NetworkXでネットワーク図作成:NetworkXの問題点とPyvisの利点

  • URLをコピーしました!
目次

NetworkX

前回、Pythonでネットワークを表示するライブラリNetworkXでフォントを指定し、日本語表示をする方法を試してみまた。

ここまででNetworkXで日本語が使えるようになって満足だったのですが、ちょっと遊びで日本の県のつながりを表示してみようとこんなプログラムを書いたら、NetworkXの問題点に当たってしまいました。

import networkx as nx

prefecture_dic = {'北海道':['青森県'],
              '青森県':['北海道','岩手県','秋田県'],
              '岩手県':['青森県','宮城県','秋田県'],
              '宮城県':['岩手県','秋田県','山形県', '福島県'],
              '秋田県':['青森県','岩手県','宮城県','山形県'],
              '山形県':['宮城県','秋田県','福島県','新潟県'],
              '福島県':['宮城県','山形県','茨城県','栃木県','群馬県','新潟県'],
              '茨城県':['福島県','栃木県','埼玉県','千葉県'],
              '栃木県':['福島県','茨城県','群馬県','埼玉県'],
              '群馬県':['福島県','栃木県','埼玉県','新潟県','長野県'],
              '埼玉県':['茨城県','栃木県','群馬県','千葉県','東京都','長野県','山梨県'],
              '千葉県':['茨城県','埼玉県','東京都','神奈川県'],
              '東京都':['埼玉県','千葉県','神奈川県','山梨県'],
              '神奈川県':['千葉県','東京都','山梨県','静岡県'],
              '新潟県':['山形県','福島県','群馬県','富山県','長野県'],
              '富山県':['新潟県','石川県','長野県','岐阜県'],
              '石川県':['富山県','福井県','岐阜県'],
              '福井県':['石川県','岐阜県','滋賀県','京都府'],
              '山梨県':['埼玉県','東京都','神奈川県','長野県','静岡県'],
              '長野県':['群馬県','埼玉県','新潟県','富山県','山梨県','岐阜県','静岡県','愛知県'],
              '岐阜県':['富山県','石川県','福井県','長野県','愛知県','三重県','滋賀県'],
              '静岡県':['神奈川県','山梨県','長野県','愛知県'],
              '愛知県':['長野県','岐阜県','静岡県','三重県'],
              '三重県':['岐阜県','愛知県','滋賀県','京都府','奈良県','和歌山県'],
              '滋賀県':['福井県','岐阜県','三重県','京都府'],
              '京都府':['福井県','三重県','滋賀県','大阪府','兵庫県','奈良県'],
              '大阪府':['京都府','兵庫県','奈良県','和歌山県'],
              '兵庫県':['京都府','大阪府','鳥取県','岡山県','徳島県'],
              '奈良県':['三重県','京都府','大阪府','和歌山県'],
              '和歌山県':['三重県','大阪府','奈良県'],
              '鳥取県':['兵庫県','島根県','岡山県','広島県'],
              '島根県':['鳥取県','広島県','山口県'],
              '岡山県':['兵庫県','鳥取県','広島県','香川県'],
              '広島県':['鳥取県','島根県','岡山県','山口県','愛媛県'],
              '山口県':['島根県','広島県','福岡県'],
              '徳島県':['兵庫県','香川県','愛媛県','高知県'],
              '香川県':['岡山県','徳島県','愛媛県'],
              '愛媛県':['広島県','徳島県','香川県','高知県'],
              '高知県':['徳島県','愛媛県'],
              '福岡県':['山口県','佐賀県','熊本県','大分県'],
              '佐賀県':['福岡県','長崎県'],
              '長崎県':['佐賀県'],
              '熊本県':['福岡県','大分県','宮崎県','鹿児島県'],
              '大分県':['福岡県','熊本県','宮崎県'],
              '宮崎県':['熊本県','大分県','鹿児島県'],
              '鹿児島県':['熊本県','宮崎県'],
              '沖縄県':[]
              }

G = nx.Graph()

for prefecture in prefecture_dic:
    G.add_node(prefecture)
    
for prefecture in prefecture_dic:
    for neighbour in prefecture_dic[prefecture]:
        G.add_edge(prefecture, neighbour)

nx.draw(G, node_color='lightblue', font_family='Hiragino Sans', with_labels = True)

実行結果

辞書形式で{‘都道府県名’:[繋がっている県1, 繋がっている県2,…]}と繋がっている県を格納してあります。

そしてNetworkXで表示してみたところ、Nodeがくっつきすぎて文字が見えません。

改善案として一つは画像サイズを大きくすること。

NetworkXのネットワーク図表示はmatplotlibを使っているようで、「plt.figure」で「figsize」のオプションを設定すると画像サイズを変更することができます。

import matplotlib.pyplot as plt
import networkx as nx

prefecture_dic = {'北海道':['青森県'],
              '青森県':['北海道','岩手県','秋田県'],
              '岩手県':['青森県','宮城県','秋田県'],
              '宮城県':['岩手県','秋田県','山形県', '福島県'],
(中略)
              '鹿児島県':['熊本県','宮崎県'],
              '沖縄県':[]
              }

fig = plt.figure(figsize=(10,8))

G = nx.Graph()

for prefecture in prefecture_dic:
    G.add_node(prefecture)
    
for prefecture in prefecture_dic:
    for neighbour in prefecture_dic[prefecture]:
        G.add_edge(prefecture, neighbour)

nx.draw(G, node_color='lightblue', font_family='Hiragino Sans', with_labels = True)

実行結果

多少は良くなりましたが、まだまだ重なっている部分、見づらい部分があります。

つまりNetworkXは複雑なネットワーク図を表示するのには向いていないのかもしれません。

ということで他のネットワーク作成ライブラリPyvisを使ってみることにしました。

Pyvisのインストール

Pyvisのインストールはいつも通りpipから行えます。

pip install pyvis

「Successfully installed pyvis-X.X.X」のように出たらインストール完了です。

とりあえず試してみる

このPyvisは、実はNetworkXで作成したネットワークのデータを読み込み、ネットワーク図を作成することができます。

ということで今回は先ほど作成したネットワーク「G」を使って、Pyvisでネットワーク図を表示してみましょう。

import networkx as nx
from pyvis.network import Network

prefecture_dic = {'北海道':['青森県'],
              '青森県':['北海道','岩手県','秋田県'],
              '岩手県':['青森県','宮城県','秋田県'],
(中略)
              '宮崎県':['熊本県','大分県','鹿児島県'],
              '鹿児島県':['熊本県','宮崎県'],
              '沖縄県':[]
              }

G = nx.Graph()

for prefecture in prefecture_dic:
    G.add_node(prefecture)
    
for prefecture in prefecture_dic:
    for neighbour in prefecture_dic[prefecture]:
        G.add_edge(prefecture, neighbour)

pyvis_G = Network()
pyvis_G.from_nx(G)
pyvis_G.show("prefecture_network.html")

まずはPyvisを使うためにインポートしますが、「from pyvis.network import Network」というように、Pyvis内の「Network」をインポートします。

NodeとEdgeを作成する部分はNetworkXを使って作成していますので、上記の例と同じです。

NetworkXでのネットワークの作成が終わったら、「pyvis_G = Network()」でPyvisのNetworkの読み込み。

そして「pyvis_G.from_nx(G)」でNetworkXのネットワークのデータをPyvisに読み込ませます。

最後に「pyvis_G.show(“prefecture_network.html”)」でPyvisでのネットワークの図を作成しますが、「htmlファイル」で出力されます。

出力された図がこちらです。

Nodeがほぼ重なっておらず、見やすくなりました。

ちなみに拡大縮小やNodeの位置をインタラクティブに動かすなんてこともできちゃいます。

しかもブラウザで表示するため、特に日本語フォントを指定することなく日本語の表示もできています。

NetworkXのように図で出力されるのではなく、一度HTMLファイルに変換されるので一手間かかりますが、それでもこれだけ綺麗に出力できるとなるとかなりのメリットがあるのではないでしょうか。

ということで次回からはこのPyvisを掘り下げていきたいと思います。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次