Python PR

【まとめ】networkxの使い方|一段階レベルアップした可視化へ!

記事内に商品プロモーションを含む場合があります

 

本記事では、NetworkXというグラフデータを扱うためのライブラリの使い方を簡単に説明します。

 

使用するライブラリをインストール

 

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

 

基本的な使い方

 

詳細は後ほど詳しく説明しますが、これからの内容をよりわかりやすく説明するために簡単な可視化方法をフライングして紹介しておきます。

# graph objectを代入
nx.draw(G, with_labels = True)
plt.show()

 

グラフの作成方法

 

一つずつノードとエッジを追加する方法

 

G_ex1 = nx.Graph()

# nodeを追加
G_ex1.add_node(1)
G_ex1.add_node(2)
G_ex1.add_node(3)
G_ex1.add_node("hoge")

# nodeの削除
G_ex1.remove_node(3)

# edgeを追加
G_ex1.add_edge(1, 2)
G_ex1.add_edge(1, "hoge")
G_ex1.add_edge(2, "hoge")

# edgeの削除
G_ex1.remove_edge(2, "hoge")

# 可視化
nx.draw(G_ex1, with_labels = True)
plt.show()

<output>

ノードとエッジを一つずつ追加する方法

 

複数のノードとエッジを作成する方法

 

G_ex2 = nx.Graph()

# nodeの追加
G_ex2.add_nodes_from([1, 2, 3, "hoge"])
G_ex2.add_nodes_from([(4, {"atr": 6}), (5, {"atr": 7})])

# nodeの削除
G_ex2.remove_nodes_from([2, 4])

# edgeの追加
G_ex2.add_edges_from([(1, 3), (1, "hoge"), (3, "hoge"), (4, 5)])
G_ex2.add_edges_from([(3, 5, {"atr": 10}), (1, 5, {"atr":11})])

# edgeの削除
G_ex2.add_edges_from([(1, 3), (3, 5)])

# 可視化
nx.draw(G_ex2, with_labels = True)
plt.show()

<output>

複数のノードとエッジを追加する方法

有向グラフの作成方法

 

有向グラフの場合は、nx.DiGraph()を使用します。

G_dir_ex1 = nx.DiGraph()

# nodeの追加
G_dir_ex1.add_nodes_from([1, 2, 3])
G_dir_ex1.add_nodes_from([(4, {"atr": 6}), (5, {"atr": 7})])

# edgeの追加
G_dir_ex1.add_edges_from([(1, 3), (2, 3), (3, 2), (4, 1), (4, 3)])
G_dir_ex1.add_edges_from([(3, 5, {"atr": 10}), (1, 5, {"atr":11})])

# 可視化
nx.draw(G_dir_ex1, with_labels = True)
plt.show()

<output>

有向グラフの作り方

グラフの性質を作成する方法

 

G_ex3 = nx.Graph()
G_ex3.add_nodes_from([1, 2, 3, 4, (5, {"atr":8})])
G_ex3.add_edges_from([(1, 2, {"atr":4}), (1, 3), (2, 3), (2, 4), (4, 5)])

print("ノードの数", G_ex3.number_of_nodes())
print("エッジの数", G_ex3.number_of_edges())
print("ノードのリスト", G_ex3.nodes)
print("ノードのリスト (属性付き)", G_ex3.nodes(data=True))
print("ノードのリスト", G_ex3.edges)
print("ノードのリスト (属性付き)", G_ex3.edges(data=True))
print("隣接行列", G_ex3.adj)
print("ノード1の近傍", G_ex3.adj[1])
print("ノード1の近傍 (別の書き方))", G_ex3[1])

# 可視化
nx.draw(G_ex3, with_labels = True)
plt.show()

<output>

グラフの性質を出力する方法

 

Networkxのグラフの可視化

複雑な可視化を行う方法を紹介します。

G_vis = nx.Graph()
G_vis.add_nodes_from([1, 2, 3, (4, {"atr": 6}), (5, {"atr": 7})])
G_vis.add_edges_from([(1, 3), (2, 3), (3, 2), (4, 1), (4, 3), 
                                    (3, 5, {"atr": 10}), (1, 5, {"atr":11})])

G_dir_vis = nx.DiGraph()
G_dir_vis.add_nodes_from([1, 2, 3, (4, {"atr": 6}), (5, {"atr": 7})])
G_dir_vis.add_edges_from([(1, 3), (2, 3), (3, 3), (4, 1), (4, 3), 
                                    (3, 5, {"atr": 10}), (1, 5, {"atr":11})])

fig, axes = plt.subplots(1, 2, figsize=(10, 5), constrained_layout=True)

# ノード配置方法の選択
pos_vis = nx.spring_layout(G_vis)
pos_dir_vis = nx.circular_layout(G_dir_vis)
# ノードの色
color_node_vis = "r"
color_node_dir_vis = ["b", "r", "g", "k", "y"]
# ノードのサイズ
size_node_vis = 500
size_node_dir_vis = [300, 500, 700, 900, 1100]
# エッジの色
color_edge_vis = "k"
color_edge_dir_vis =["b", "r", "g", "k", "y", "c"]
# エッジの太さ
width_vis = 5
width_dir_vis = [3, 4, 5, 6, 7, 8]
# 矢印の太さ
arrowsize = 30
# ラベルの大きさ
fontsize = 20

nx.draw(G=G_vis, pos=pos_vis, with_labels =True, font_size=fontsize, font_color="w",
        node_color=color_node_vis, node_size=size_node_vis, node_shape="o",
        edge_color=color_edge_vis, style="--", width=width_vis,
        ax=axes[0])
nx.draw(G=G_dir_vis, pos=pos_dir_vis, with_labels=False, 
        node_color=color_node_dir_vis, node_size=size_node_dir_vis, node_shape="*",
        edge_color=color_edge_dir_vis, width=width_dir_vis, arrowsize=arrowsize,
        ax=axes[1])
plt.show()

<output>

ノード配置方法はいくつか方法があり、よく使用するものを以下にまとめておきます。

配置方法 説明
nx.random_layout() ノードをランダムに配置
nx.circular_layout() ノードを円周上に配置
nx.spring_layout() ノードをスプリングモデルに基づき配置
(バネの斥力、引力に基づき綺麗に配置)
nx.shell_layout() ノードを複数の円状のシェルに配置
nx.specral_layout() スペクトラル埋め込みを用いて配置
nx.kamada_kawai_layout() kamada-Kawai path-lengthコスト関数に基づき配置

 

まとめ

 

本記事では、NetworkXの使い方をコンパクトに説明しました。

 

ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点
Python学習を効率化させるサービス

 

Pythonを学習するのに効率的なサービスを紹介していきます。

まず最初におすすめするのは、Udemyです。

Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。

また、セール中は1500円定義で利用することができ、コスパも最強です。

下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。

 

【最新】UdemyでおすすめのPythonコース|東大生が厳選!10万を超える講座があるUdemyの中で、Pythonに関係する講座を厳選しました。また、本記事では、Udemyを使用しながらPythonをどのような順番で勉強するべきかを紹介しました。ぜひ参考にしてください。...

 

他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。

 

【最新】Pythonに強いプログラミングスクール7選|東大生が厳選Pythonの流行と共に、Pythonに強いプログラミングスクールが増えてきました。本記事では、特にPythonを効率的に学ぶことができるプログラミングスクールを経験をもとに厳選して、内容を詳しく解説しています。...

 

自分の学習スタイルに合わせて最適なものを選びましょう。

また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。