概要
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の使い方をご紹介しました。便利で可能性の高いツールだと思いますので、皆様も是非試してみてください。