Python
 Computer >> コンピューター >  >> プログラミング >> Python

networkx(Matplotlib)でエッジを重みに応じて色分けする方法

networkx を使って、グラフのエッジを重み(weight)に応じて色分けして描画する方法を解説します。エッジの重みを視覚的に表現することで、ノード間の関係性の強さがひと目でわかるグラフを作成できます。

実装の手順

  • 図のサイズを設定し、サブプロット周辺の余白(パディング)を調整します。
  • エッジや名前、グラフ属性などを指定してグラフを初期化します。
  • 現在のグラフにノードを追加します。
  • 現在のグラフのノード同士をつなぐエッジを追加します。
  • グラフのエッジを走査し、それぞれに重みを設定します。
  • 重みをエッジの色として使い、グラフを描画します。
  • 図を表示するには show() メソッドを使用します。

コード例

import random as rd
import matplotlib.pylab as plt
import networkx as nx

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

G = nx.DiGraph()
G.add_nodes_from([1, 2, 3, 4])
G.add_edges_from([(1, 2), (2, 3), (3, 4), (4, 1), (1, 3)])
for u, v, d in G.edges(data=True):
    d['weight'] = rd.random()
edges, weights = zip(*nx.get_edge_attributes(G, 'weight').items())
nx.draw(G, node_color='b', edge_color=weights, width=2, with_labels=True)

plt.show()

コードのポイント

このコードでは、まず nx.DiGraph() で有向グラフを作成し、4つのノードと5つのエッジを追加しています。その後、G.edges(data=True) で各エッジを走査しながら random.random() によるランダムな値を重みとして割り当てています。

nx.get_edge_attributes(G, 'weight') を使うことで、エッジと重みの対応を辞書形式で取得でき、zip(*...) で展開することにより重みのリストを抽出できます。このリストを nx.draw()edge_color 引数に渡すことで、重みの大きさに応じたカラーマップでエッジが自動的に色分けされます。また、node_color='b' でノードを青色に、with_labels=True でノード番号のラベルを表示しています。

出力結果

networkx(Matplotlib)でエッジを重みに応じて色分けする方法

実行すると、重みの値に応じて濃淡の異なる色で描かれた有向グラフが表示されます。重みが大きいエッジほど明るい色(または指定したカラーマップに従った色)で表現されるため、ネットワーク内の重要な接続関係を直感的に把握できます。

  1. Matplotlibでプロット上のテキストをアニメーション表示する方法

    Matplotlibでは、FuncAnimationクラスを活用することで、プロット上に配置したテキストを簡単にアニメーション化できます。例えば、文字が一文字ずつタイプされていくような演出も実装可能です。 実装の手順 figureのサイズを設定し、サブプロット間・周囲の余白(パディング)を自動調整します。 X軸とY軸の表示範囲(リミット)を指定します。 表示したい文章を格納するstring変数を初期化します。 text()メソッドを使って、プロット上にテキストを配置します。 FuncAnimation()を用いてテキストをアニメーション化し、フレームごとに表示する文字列を更新します。 axi

  2. Matplotlibとnetworkxでノードの輪郭線の色を変更する方法

    networkxで作成したグラフのノード輪郭(枠線)の色を変更したい場合は、set_edgecolor()メソッドを使用します。draw_networkx_nodes()で返されるノードコレクションオブジェクトに対してこのメソッドを呼び出すことで、ノードの外周に好きな色を付けることができます。実装の手順「from」列と「to」列を持つPandasデータフレームを作成します。エッジリストを含むデータフレームからnx.from_pandas_edgelist()でグラフを生成します。spring_layout()などでノードの配置位置を計算します。draw_networkx_nodes()を使って