本記事では、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
の使い方をコンパクトに説明しました。
Pythonを学習するのに効率的なサービスを紹介していきます。
まず最初におすすめするのは、Udemyです。
Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。
また、セール中は1500円定義で利用することができ、コスパも最強です。
下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。
【最新】UdemyでおすすめのPythonコース|東大生が厳選!10万を超える講座があるUdemyの中で、Pythonに関係する講座を厳選しました。また、本記事では、Udemyを使用しながらPythonをどのような順番で勉強するべきかを紹介しました。ぜひ参考にしてください。...
他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。
【最新】Pythonに強いプログラミングスクール7選|東大生が厳選Pythonの流行と共に、Pythonに強いプログラミングスクールが増えてきました。本記事では、特にPythonを効率的に学ぶことができるプログラミングスクールを経験をもとに厳選して、内容を詳しく解説しています。...
自分の学習スタイルに合わせて最適なものを選びましょう。
また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。