数学やプログラミングの備忘録

数理最適化, Python, C++をメインに紹介するブログ。

MENU

NetworkX - グラフのノードとエッジに色を設定する方法

pythonパッケージであるNetworkXで、グラフのノードとエッジに色を設定する方法を紹介します。

目次

NetworkXでノードとエッジに色を設定するpythonコード

いろいろ説明する前に、実際に色を設定するpythonコードを紹介します。

pythonとパッケージのバージョンはこちら:

  • python 3. 7. 2
  • networkx 2. 4
  • matplotlib 3. 3. 0

実行結果はこちら:

f:id:cresselia2012:20200906095115p:plain

では、ノードとエッジ、それぞれ色の設定方法を解説していきます。

ノードの色の設定方法

上のコードを部分的に解説していきます。

# ノードを追加
G.add_nodes_from([
    (0, {"color" : "darkorange"}),
    (1, {"color" : "lightblue"}),
    (2, {"color" : "lightblue"}),
    (3, {"color" : "lightblue"}),
    (4, {"color" : "royalblue"}),
    (5, {"color" : "royalblue"}),
    (6, {"color" : "royalblue"}),
    (7, {"color" : "steelblue"}),
    (8, {"color" : "steelblue"}),
    (9, {"color" : "steelblue"})
    ])

このコードでは、G = nx.Digraph() で定義された有向グラフにノードを追加していて、darkorange lightblue royalblue steelblue という色を設定しています。設定できる色の一覧はこの記事の最後で紹介します。

  • add_nodes_from(): グラフにノードを追加
    • 引数はlist型
    • listの各要素はtuple型で(ノード番号, dict型のノード属性)

このようにグラフにノードを追加することで、ノードにcolorという色を表す属性を設定することができます。

次に、グラフをmatplotlibで出力するために、ノードの色設定をnode_color に取得します。

# ノードの色をセット
node_color = [node["color"] for node in G.nodes.values()]

最後に、draw_networkx 関数でグラフを出力するときに node_color を引数に与えれば、ノードの色の設定は完了です

nx.draw_networkx(G, pos, edge_color=edge_color, node_color=node_color)

エッジの色の設定方法

ノードのとき同じように、上で紹介したコードを部分的に解説していきます。

# エッジの追加(方法1)
edges = [
    (0, 1, {"color" : "lightblue"}),
    (1, 2, {"color" : "lightblue"}),
    (2, 3, {"color" : "lightblue"}),
    (3, 0, {"color" : "lightblue"})
    ]
G.add_edges_from(edges)

# エッジの追加(方法2)
nx.add_path(G, [0,4,5,6,0], color="royalblue")
nx.add_path(G, [0,7,8,9,0], color="steelblue")

ここでは、G = nx.Digraph() で定義された有向グラフにエッジを追加していて、 lightblue royalblue steelblue という色を設定しています。

  • add_edges_from 関数でエッジを追加
    • 引数はlist型で、listの各要素は tuple 型: (始点, 終点, dict型のエッジ属性)
  • add_path 関数でパスに含まれるエッジを追加
    • color で色を指定すると、パスに含まれる全てのエッジに適用される

ノードのときと同じように、エッジにcolorという色を表す属性を設定することができます。そして、エッジの色設定をedge_color に取得し、draw_networkx 関数きに edge_color を引数に与えれば、エッジの色の設定は完了です

# エッジの色をセット
edge_color = [edge["color"] for edge in G.edges.values()]

# 中略

# グラフを出力
nx.draw_networkx(G, pos, edge_color=edge_color, node_color=node_color)

さらに詳しい解説は、NetworkXの公式ドキュメントを参照ください:

Software for Complex Networks — NetworkX 2.5 documentation

NetworkXで設定できる色の一覧

上のpythonコードでは matplotlib を使っていますので、NetworkXで設定できる色は matplotlib と同じです。設定できる色と名前の一覧はこちらです:

f:id:cresselia2012:20200906095212p:plain

画像はmatplotlib の公式サイトから引用しています:

color example code: named_colors.py — Matplotlib 2.0.2 documentation