このくにのかたち(物理)

まちづくりやインフラの観点から日本について考察したい人間の雑記

MENU

networkxを用いた重み付きグラフの描画

概要

 以前,Dijkstra法のpythonでの実装 - このくにのかたち(物理)を書いたとき,わかりやすいようにネットワーク図を描いたのです.パワーポイントで.図とテキストボックスを組み合わせてコツコツと
 その手間もちょっとアホらしかったので,networkxとmatplotlibを用いて,ネットワーク図(グラフ)を描画するプログラムを描いてみました.

コード

# coding: utf-8 #おまじない

import networkx as nx
import matplotlib.pyplot as plt

#新規グラフを作成
#G = nx.Graph() #無向グラフ
G = nx.DiGraph() #有向グラフ

#ノードを追加
G.add_node(1)
G.add_nodes_from([1,2,3,4,5,6])
pos = {1:(0,0),2:(1,1),3:(1,-1),4:(2,1),5:(2,-1),6:(3,0)} #ノードの座標を設定

#エッジを追加
G.add_weighted_edges_from([
    (1,2,30),
    (1,3,25),
    (2,3,40),
    (2,4,35),
    (3,5,15),
    (4,6,45),
    (5,4,10),
    (5,6,40)
    ]) #(始点,終点,重み)でエッジを設定
edge_labels = {(i, j): w['weight'] for i, j, w in G.edges(data=True)} #エッジラベルの描画時に'weight'の表示を無くすための工夫

#◆図の描画
nx.draw_networkx_nodes(G, pos, node_size=500, node_color='white',edgecolors='black') #ノードを描画
nx.draw_networkx_edges(G, pos, width=1) #エッジを描画
nx.draw_networkx_labels(G, pos) #(ノードの)ラベルを描画
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) #エッジのラベルを描画

plt.show()

出力

f:id:SooZy:20200621181656p:plain
きれいに出力されました.
これでパワーポイントとはおさらばですね.