概要
PythonにはETEという木構造を可視化するためのライブラリがあります。これを使うと、下記のようなユニークな図が描けます。本記事ではこのモジュールの使い方について紹介したいと思います。

インストールは他ライブラリと同様に
pip install ete3
でOKです。
ETEオブジェクトの構成
以下は私がETEを使って作成した決定木(Irisで作成)のサンプル画像です。ETEを使うと、クラスの画像を表示したり、リーフのデータの特徴を棒グラフで表示したりと、表現の高い決定木が描けることが伝わるのではないでしょうか。

このサンプル画像には下記に示す5つの情報が含まれています。
- 決定木構造
- 分岐条件等の文字
- 円グラフ
- 写真
- 棒グラフ
一方、ETEではTreeオブジェクトに大きく3つの要素があり、それぞれが上記に示す各情報と次のように対応しています。
- Node:決定木構造
- Style:木の表示方法(サンプルでは横向きを指定)
- Face:それ以外(文字やグラフ等)
作成手順
オブジェクトの作成手順は①インスタンス作成、②Node定義、③Face追加、④表示方法指定です。以下順番に説明していきます。
インスタンス作成
インスタンス作成は、Treeクラスを呼び出して実行します。まずは何もないオブジェクトを作成してみます。
from ete3 import Tree
if __name__ == "__main__":
Tree = Tree()
Tree.show()
Tree.showと入力することで、ETEの専用ビューワーが開きます。何もないオブジェクトの場合、以下のように表示されるはずです。

Node定義
次に簡単な構造を指定してみましょう。インスタンス作成時に適当な構造を指定してみます。
from ete3 import Tree
if __name__ == "__main__":
Tree = Tree('((A,B),C,D);')
Tree.show()
Tree.showと入力することで、ちゃんと木構造が認識されていることが分かります。

後付けで構造を定義したい場合にはsearch_nodesを使って親ノードを切り替えながら、add_childを使います。
from ete3 import Tree
if __name__ == "__main__":
Tree = Tree()
Tree.add_child(name='E')
Tree.add_child(name='C')
Tree.add_child(name='D')
node = Tree.search_nodes(name='E')[0]
node.add_child(name='A')
node.add_child(name='B')
Tree.show()
Tree.showとすれば、同様の木構造が得られます。

その他、ファイルからの読み書きや各種フォーマットに対応しており、詳細は公式のチュートリアルを参考にしてみてください。
Face追加
上記で定義した木構造から特定のノードをsearch_nodes等を用いて選択し、別途定義した各種Faceを加えることで木に様々な要素を追加できます。
from ete3 import Tree, ImgFace, TextFace
if __name__ == "__main__":
Tree = Tree('((A,B),C,D);')
imgface = ImgFace("Iris-versicolor-21_1.jpg", height=50)
textface = TextFace("Testmassage")
node = Tree.search_nodes(name='A')[0]
node.add_face(imgface, column=0, position="branch-right")
node.add_face(textface, column=1, position="branch-top")
node.add_face(textface, column=2, position="branch-right")
Tree.show()
ImgFaceで画像を、TextFaceで文字列のFaceを定義しています。また、add_faceで追加するFaceと順番(column)と場所(position)を指定し、ノードAに追加しています。
Tree.showとすると、文字列や写真が追加されていることが分かります。

その他のFaceやオプション引数の説明に関しては、ETEマニュアルの該当ページを確認してみてください。
表示方法指定
TreeStyleを用いることで、木構造の表示オプションを指定できます。何はともあれやってみましょう。
from ete3 import Tree, ImgFace, TextFace, TreeStyle
if __name__ == "__main__":
Tree = Tree('((A,B),C,D);')
imgface = ImgFace("Iris-versicolor-21_1.jpg", height=50)
textface = TextFace("Testmassage")
node = Tree.search_nodes(name='A')[0]
node.add_face(imgface, column=0, position="branch-right")
node.add_face(textface, column=1, position="branch-top")
node.add_face(textface, column=2, position="branch-right")
ts = TreeStyle()
ts.mode = "c"
ts.show_leaf_name = True
ts.show_scale = False
ts.guiding_lines_type = 0
Tree.show(tree_style=ts)
tsという変数をTreeStyleのインスタンスにし、細かい画面表示のオプションをしてしています。
Tree.showとすると、ちょっと不思議?な円型の木構造が表示されています。

その他の各種Faceや表示のためのオプション引数の説明に関しては、同様にETEマニュアルの該当ページを確認してみてください。
その他
ここでは紹介できませんが、上記で紹介した手順の内容以外にもNodeStyleやClusterTree等、様々な要素があります。
まとめ
木構造をシャレオツ?に可視化できるライブラリ:ETEの使い方をご紹介しました。便利で可能性の高いツールだと思いますので、皆様も是非試してみてください。