PythonのGraphviz エッジの設定#

公開日

この記事ではPythonのGraphvizでエッジ(線)を設定する方法を解説します。 エッジのラベル、線の種類、色、矢印の向きや先端形状を設定できます。

エッジ設定の基本#

エッジの設定方法には、グラフ全体でまとめて変更する方法と、個別のエッジ設定を変更する方法の2つがあります。

グラフ全体でまとめて変更する場合、グラフオブジェクトのattr()メソッドを使用します。attr()メソッドの第1引数を"edge"として、第2引数以降に設定を記述します。以下に例を示します。

from graphviz import Digraph

graph = Digraph()
graph.attr("edge", color="red", style="dashed")
graph.edge("node1", "node2")
graph.edge("node1", "node3")
graph
../_images/99093db15981a403855c4d48f64c3d462a41d16c9e3d191caba9735da7fa22b9.svg

一方、個別のエッジごとに設定する場合、以下のようにグラフオブジェクトのedge()メソッドに設定を記述します。

graph = Digraph()
graph.edge("node1", "node2", color="red", style="dashed")
graph.edge("node1", "node3")
graph
../_images/261019b139d63ac3fef89856b53ba162dca684d4f7a89d2c2061ce7051ad613a.svg

以降では、エッジに設定可能な項目を解説します。

ラベル#

エッジのラベルはedge()メソッドのlabelオプションで追加できます。

graph = Digraph()
graph.edge("node1", "node2", label="label")
graph
../_images/7e23c5744b64bd50ad03a36647ec4885d79de61c1a97f663bb55208e2cec3f96.svg

ラベルの表示には以下のオプションが指定できます。

  • fontcolor: 文字の色

  • fontsize: 文字サイズ

  • fontname: フォントの種類

graph = Digraph()
graph.edge("node1", "node2", label="label", fontcolor="red", fontsize="20", fontname="Arial")
graph
../_images/a51afe5e0e4f6f0ce88be09fdfe7d4f27584a44dc13c27c8e6124d37142ab335.svg

エッジの根本側と先端側にラベルを追加する場合、headlabel, taillabelオプションを使用します。

graph = Digraph()
graph.edge("node1", "node2", headlabel="headlabel", taillabel="taillabel")
graph
../_images/3032a65b13ef9b8e3a74bc79e4cdec006bac9b1f49ee97f8a9446577a2045723.svg

線の種類#

エッジの線の種類はstyleで指定できます。 以下の4種類があります。

graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", style="solid", label="solid") # 実線
graph.edge("2", "3", style="dashed", label="dashed") # 破線
graph.edge("3", "4", style="dotted", label="dotted") # 点線
graph.edge("4", "5", style="bold", label="bold") # 太線
graph
../_images/a1036eabc179a4a4ca1d82520d16a709751152477f746291cf49c1411cb27a69.svg

線の色#

エッジの線の色はcolorで指定できます。

graph = Digraph()
graph.edge("node1", "node2", color="red")
graph
../_images/b30b65acc5853dfe5bd75ca1b907cff60836615ae84e4cc29ade07d6c529ba62.svg

矢印の向き#

エッジの矢印の向きはdirオプションで指定できます。 以下の4種類があります。

graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", dir="forward", label="forward") # 順方向
graph.edge("2", "3", dir="back", label="back") # 逆方向
graph.edge("3", "4", dir="both", label="both") # 両方向
graph.edge("4", "5", dir="none", label="none") # なし
graph
../_images/fd0e5fdc79604e3962afd87b458dd5310f41f351103f58e14fab432fe566e6f6.svg

矢印の先端形状#

エッジの矢印の先端形状はarrowhead(先端側)、arrowtail(根本側)でそれぞれ指定できます。

graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", arrowhead="normal", label="normal")
graph.edge("2", "3", arrowhead="open", label="open")
graph.edge("3", "4", arrowhead="crow", label="crow")
graph.edge("4", "5", arrowhead="none", label="none")
graph
../_images/9bf8098d531729caa74bde273b14d7e2d134a54bbe4213cca2232820780f577d.svg
graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", arrowhead="dot", label="dot")
graph.edge("2", "3", arrowhead="odot", label="odot")
graph.edge("3", "4", arrowhead="invdot", label="invdot")
graph.edge("4", "5", arrowhead="invodot", label="invodot")
graph
../_images/9fa3d49776978cb3d1cc2e503490cbac0cc10726626586098e6865fe6a9f34cc.svg
graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", arrowhead="empty", label="empty")
graph.edge("2", "3", arrowhead="invempty", label="invempty")
graph.edge("3", "4", arrowhead="diamond", label="diamond")
graph.edge("4", "5", arrowhead="odiamond", label="odiamond")
graph
../_images/731c5e851f8d617ed19eb9a72444ddb70961060464d26866797ce5ce77c75a67.svg
graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", arrowhead="inv", label="inv")
graph.edge("2", "3", arrowhead="tee", label="tee")
graph.edge("3", "4", arrowhead="halfopen", label="halfopen")
graph
../_images/87633efec85ef280e63c42e53b69f91a70a2225f9d7a2fb87a663e7c1eef8ffc.svg
graph = Digraph()
graph.attr('graph', rankdir="LR")
graph.edge("1", "2", arrowhead="curve", label="curve")
graph.edge("2", "3", arrowhead="icurve", label="icurve")
graph
../_images/5a1026232341a2c80da4db3e62955ee75526376387badaa214c4259b028d855b.svg