はじめに
dtreevizで描いたデシジョンツリーは本当にきれいです。
dtreevizで実行したデシジョンツリーは、セルに表示させることも、画像として保存することもできます。
基本は、これで事足りるのですがが、できればdtreevizのデシジョンツリー画像をPlotlyで表示させたくなりました。
大きなサイズのデシジョンツリーほど、全体を見て⇔部分を見てということを繰り返します。Plotly で表示させた画像は、ズームイン・ズームアウトがインタラクティブにできますので きっと便利だろうということと、デシジョンツリー画像を Dashによるダッシュボードに反映できるようになるからです。
dtreevizで保存できる画像形式は svg 。
この画像形式のままでは(この記事を書いている時点では)Plotly で表示できませんので、すこし力業的な実行となりましたが、画像形式を JPEG に変換し、対応しました。
実行条件など
- Google colabで実行
aspose.words によるJPEG変換
aspose.words は、さまざまなdocumentや画像形式 の変換に対応したライブラリです。
変換だけではなく、生成、変更、レンダリング、印刷などの機能もあるようです。
以下は、aspose.words による svg → jpeg の実行コードです。
dtreeviz の決定木画像(ファイル名:Decission_tree_result.svg)を読み込み、「Output.jpeg」に出力させています。
ファイル名は任意に変更してください。
!pip install aspose-words
import aspose.words as aw
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
shape = builder.insert_image("Decission_tree_result.svg")
shape.image_data.save("Output.jpeg")
#shape.image_data.save("Output.png")
#https://products.aspose.com/words/ja/python-net/conversion/svg-to-png/
次にPlotlyで表示させます。
無事に実行できましたが、すこし解像度があらいので、すこし見づらいかなというところです。
import plotly.express as px
from skimage import io
img = io.imread('Output.jpeg')
fig = px.imshow(img)
fig.show()
svglib によるPDF変換 → pdf2image によるJPEG変換
svglib は、svgを他の形式に変換するためライブラリです。
svglib で、svg → JPEG、svg → PNGともに実行できたのですが、なぜか数字・文字がまったく表示されませんでした。
このため、力業的となりますが、
という手順で進めました。
まず、 svglib で svg → PDF変換を実行しました。
!pip install svglib
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPDF, renderPM
drawing = svg2rlg("Decission_tree_result.svg")
renderPDF.drawToFile(drawing, "Decission_tree_result.pdf")
次に、poppler と pdf2image をインストールし、
!apt-get install poppler-utils
!pip install pdf2image
PDF → JPEG変換の前に、PDFをセルに表示させました。
解像度も悪くありません。
Google Colabで、セルにPDF表示させたい場合は、これはこれで便利です。
import subprocess
subprocess.Popen(['Decission_tree_result.pdf'],shell=True)
from pdf2image import convert_from_path
images = convert_from_path("Decission_tree_result.pdf")
images[0]
PDF → JPEG変換です。ファイル名('Decission_tree_result.jpg)と変換形式(’JPEG’)を指定して実行しています。
images内に複数の画像があること想定したコードとなっています。#にある +str(i) をコードに加えると、ファイル名のあとに連番がつきます。
今回は、1枚の画像を読むだけなので +str(i) は除いています。
for i in range(len(images)):
images[i].save('Decission_tree_result'+'.jpg', 'JPEG')
# images[i].save('file_name'+str(i)+'.jpg', 'JPEG')
最後にPlotly 表示です。
import plotly.express as px
from skimage import io
img = io.imread('Decission_tree_result.jpg')
fig = px.imshow(img)
fig.show()
最後に
dtreeviz 実行 → svg出力 → PDF変換 → JPEG変換 →Plotly 表示(→ Dash に反映:記事はPlotly表示まで)... と、かなりの力業となりましたが、ファイル名を決めておけば、自動実行できると思います。
Plotly で画像をズームイン・ズムアウトさせることができるのは、とても便利です。
ただ、もっとスマートにできないものか。。。^_^;
よりよい方法をご存知の方がおられたら、ぜひご教示を。
参考サイト