スキップしてメイン コンテンツに移動

NetworkXで可視化

長文を読むのは大変ですよね。Pythonで自然言語処理をすることで、可視化する手法があるそうなので、挑戦してみます。

可視化の手段としてNetworkXが使えそうです。
GalleryのAlgorithmsのところに「Betweenness Centrality」が紹介されていましたので、ダウンロードしてグラフを作成しました。紹介されていたものにはテキストがありませんでしが、テキストを表示するようにしました。




Network download (inetbio.org)

何をしているコードなのか調べます。

# ライブラリーのインストール
from random import sample
import networkx as nx
import matplotlib.pyplot as plt



  1. randomモジュールからsample関数をインポートしています。
  2. この関数は、リストなどから指定した数の要素をランダムに選ぶために使います。
  3. networkxライブラリをnxというエイリアスでインポートしています。
  4. このライブラリは、ネットワークやグラフを作成・操作するための強力なツールです。
  5. matplotlibライブラリのpyplotモジュールをpltというエイリアスでインポートしています。
  6. pyplotは、データの視覚化を行うための機能を提供します。

# データの読み込み

G = nx.read_edgelist("WormNet.v3.benchmark.txt")


  1. networkxの関数で、エッジリスト形式のデータを持つテキストファイルを読み込み、そのデータを使ってグラフオブジェクトを作成します。
  2. エッジリストとは、ノード間の接続(エッジ)の情報をリスト形式で記述したもので、通常は2列の形式で、1行が2つのノードを表すことが多いです。このデータも1行に2つのノードが入っています。

# 実行速度を上げるためにランダムにノードを削除
num_to_remove = int(len(G) / 1.5)
nodes = sample(list(G.nodes), num_to_remove)
G.remove_nodes_from(nodes)

  1. num_to_remove = int(len(G) / 1.5)は、グラフGのノードの総数を取得し、その1.5分の1の数(約66%)を計算しています。この数が、削除するノードの数を決定します。
  2. nodes = sample(list(G.nodes), num_to_remove)は、G.nodesでグラフのすべてのノードを取得し、list()でリストに変換します。sample()関数を使って、そのリストからnum_to_remove個のノードをランダムに選びます。
  3. G.remove_nodes_from(nodes)は、ランダムに選ばれたノードをグラフGから削除します。

# 低次数のノードを除去
low_degree = [n for n, d in G.degree() if d < 10]
G.remove_nodes_from(low_degree)

  1. G.degree() は、グラフ G 内の全てのノードに対する次数を返します。ここで d は各ノードの次数を表します。
  2. リスト内包表記 [n for n, d in G.degree() if d < 10] は、次数が10未満のノードを抽出しています。具体的には、(n, d) というタプルを各ノードに対して生成し、その中で if d < 10 の条件に合致するものをリストに追加しています。
  3. G.remove_nodes_from(low_degree) は、上記で抽出した low_degree リストに含まれるノードをグラフ G から削除します。


# 最大の連結成分を抽出
components = nx.connected_components(G)
largest_component = max(components, key=len)
H = G.subgraph(largest_component)

  1. components = nx.connected_components(G)は、グラフ G のすべての連結成分を見つけます。各連結成分は、ノードの集合として表されます。
  2. largest_component = max(components, key=len) は、components という連結成分の集合の中から、最大の成分を選択しています。ここで key=len は、各成分の長さ(ノード数)を基準にして最大の成分を選ぶためのキー関数です。
  3. H = G.subgraph(largest_component) は、元のグラフ G から largest_component に含まれるノードとその間のエッジだけを取り出して、新しい部分グラフ H を作成しています。つまり、H は元のグラフ G の中で最大の連結成分だけを含んでいます。


# 媒介中心性を計算
centrality = nx.betweenness_centrality(H, k=10, endpoints=True)

  1. nx.betweenness_centrality(H, k=10, endpoints=True) は、グラフ H の各ノードについて、他のノード間の最短経路にどれだけ関与しているかを示す値を計算します。
  2. k=10 は、計算の際に考慮するノードの数を制限しており、最も重要なノードの10個を選ぶことを示します。
  3. endpoints=True は、最短経路の端点もカウントするオプションです。これにより、最短経路が端点を含む場合にも、そのノードが媒介中心性に寄与します。

# コミュニティ構造の計算
lpc = nx.community.label_propagation_communities(H)
community_index = {n: i for i, com in enumerate(lpc) for n in com}

  1. nx.community.label_propagation_communities(H) を呼び出すことで、グラフ H におけるノードのコミュニティを検出します。ラベル伝播法を用いて、ノードがどのコミュニティに属するかを決定します。
  2. {n: i for i, com in enumerate(lpc) for n in com} は、辞書内包表記を使って、各ノード n をその所属するコミュニティのインデックス i にマッピングします。この結果、各ノードがどのコミュニティに属しているかを示す community_index という辞書が作成されます。

#### グラフ描画 ####
fig, ax = plt.subplots(figsize=(20, 15))
pos = nx.spring_layout(H, k=0.15, seed=4572321)
node_color = [community_index[n] for n in H]
node_size = [v * 20000 for v in centrality.values()]
nx.draw_networkx(
    H,
    pos=pos,
    with_labels=Ture,
#   with_labels=False, FalseとなっているところをTrueに書き換え
    node_color=node_color,
    node_size=node_size,
    edge_color="gainsboro",
    alpha=0.4,
)

  1. fig, ax = plt.subplots(figsize=(20, 15)) で、20x15インチのサイズの図を作成しています。
  2. pos = nx.spring_layout(H, k=0.15, seed=4572321) で、グラフHのノードの位置をスプリングレイアウトを使って計算しています。kはノード間の距離のスケール、seedは再現性のためのランダムシードです。
  3. node_colorは、各ノードのコミュニティインデックスに基づいて色を決定しています。node_sizeは、各ノードの中心性を基にしたサイズを設定しています。中心性の値に20000を掛けています。
  4. nx.draw_networkxを使って、グラフを描画しています。with_labels=Falseはノードにラベルを表示しない設定です。node_color, node_sizeでそれぞれノードの色とサイズを指定し、edge_color="gainsboro"でエッジの色を薄い灰色に、alpha=0.4で透明度を設定しています。

# タイトルと凡例
font = {"color": "k", "fontweight": "bold", "fontsize": 20}
ax.set_title("Gene functional association network (C. elegans)", font)


  1. font辞書を定義し、タイトルのフォントスタイルを指定しています。色は黒("k")、太字、フォントサイズは20です。
  2. ax.set_titleで指定したタイトルをグラフに設定します。


# 凡例の色変更
font["color"] = "r"

ax.text(
    0.80,
    0.10,
    "node color = community structure",
    horizontalalignment="center",
    transform=ax.transAxes,
    fontdict=font,
)
ax.text(
    0.80,
    0.06,
    "node size = betweenness centrality",
    horizontalalignment="center",
    transform=ax.transAxes,
    fontdict=font,
)

  1. 凡例のテキストの色を赤("r")に変更しています。
  2. ax.textを使って、グラフの特定の位置にテキストを追加しています。0.800.100.06は、グラフの座標系における位置を指定しています(ax.transAxesを使うことで、0から1の範囲で位置を指定)。horizontalalignment="center"でテキストを中央揃えにしています。
# 可読性を高めるための最終調整
ax.margins(0.1, 0.05)
fig.tight_layout()
plt.axis("off")
plt.show()

  1. ax.marginsを使って、グラフの周囲に余白を設定しています。ここでは、x軸に対して10%(0.1)、y軸に対して5%(0.05)のマージンを追加しています。これにより、ラベルやノードが図の端に近づきすぎるのを防ぎます。
  2. tight_layoutメソッドを呼び出すことで、図全体のレイアウトを自動的に調整し、ラベルやタイトルが重ならないようにしています。これにより、全体の見た目が整えられます。
  3. plt.axis("off")を使用して、グラフの軸(x軸とy軸)を非表示にしています。これにより、視覚的にグラフがすっきりとし、データの視認性が向上します。
  4. 最後に、plt.show()でグラフを表示します。




コメント

このブログの人気の投稿

Dockerを始めてみる。”お使いのPCでは実行できません”??

 Webアプリの開発環境を構築するために、Dockerを始めるまでのハマったところです。 ❶ Docker: Accelerated Container Application Development で のWindows用をダウンロードからAMD64を選択します。 ❷ダウンロードしたexeファイルをクリックします。 ❸しかし、使えない。 ❹再起動します。でも使えない。 ❺Dockerのトップページの下の方を見ると、Download Dockerのページがあります。先ほどダウンロードしたのはトップページの一番上からでしたが、Download DockerのGet Startedに入り、Docker Desktop for Windows - x86_64をダウンロードしてみます。 ❻今度はexeファイルをクリックでき、次に進めたので、Add shortcut to desktopを☑したままOKをクリックします。 ❼ダウンロードできたのでCloseをクリックします。 ❽デスクトップ上にはアイコンが作成されているので、アイコンをクリックします。 ❾利用規約を読んでOKをクリックします。個人利用なので問題ありませんが、商用利用では「小規模なビジネス向け」にあたるかで、線引きがあるようですね。小規模なビジネス向けは、従業員が250人未満、かつ、年間収益が1,000万米ドル(または相当する現地通貨)未満の商業活動だそうです。 よくたずねられる質問(FAQ) | Docker ドキュメント (matsuand.github.io) ❿アカウントを作成してDocker始められるようになりました。 まとめ AMD64ではなく、 x86_64 をダウンロードすること。

VSCodeでDockerを使う

Dockerをインストールしたので、早速使えるようにVSCodeを立ち上げます。 ❶Dockerのインストール。VSCodeを立ち上げ、拡張機能から"Docker"を検索し、インストールを行う。 ❷ デスクトップ上にSample-Projectフォルダを作成する。 ❸VSCode上で、Open &Workspace FolderのOpen Folderをクリックします。 ❹VSCode上に、SAMPLE-PROJECTが表示されます。 ❺SAMPLE-PROJECTの2つ右横の"新しいフォルダ..."をクリックしてフォルダを作成します。webという名前にします。 ❻webフォルダを右クリックして、"新しいファイル..."をクリックします。ファイル名はindex.phpとして、以下のように打ち込みます。 ❼ターミナルでwebと同じ階層にymlファイルを作成します。"New-Item -Path "絶対パスからdocker-compose.yml" -ItemType File"と入力すると、空のymlファイルが作成されます。 ❽空のymlファイルの中身を以下のように打ち込みます。 ❾サーバーの起動を確認します。新しくターミナルを開いて、以下のように入力します。 ❿少し待つと、以下のようにCreatedとStartedと表示されます。 ⓫ブラウザで表示確認をします。アドレス欄に"localhost:8080"と入力すると、phpの設定情報が表示されます。 ⓫サーバーを停止するには、ターミナルで"docker-compose stop"と入力します。すると、❿のlocalhostのページも接続不可になります。 まとめ VSCodeの拡張機能でDockerを使えるのだったら、Dockerのインストールは不要だったのかも? とも思いますが、下準備が終わったので、さっそく使います。