2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

dtreevizで描いたデシジョンツリーをplotlyで表示したい ~Google Colab~

Last updated at Posted at 2022-05-17

image.png

はじめに

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()

image.png

svglib によるPDF変換 → pdf2image によるJPEG変換

svglib は、svgを他の形式に変換するためライブラリです。
svglib で、svg → JPEG、svg → PNGともに実行できたのですが、なぜか数字・文字がまったく表示されませんでした。

このため、力業的となりますが、

  1. svglib で、svg → PDF を実行。
  2. pdf2image で、PDF → JPEG を実行。

という手順で進めました。

まず、 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")

次に、popplerpdf2image をインストールし、

!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]

image.png

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()

image.png

以下は、ズームイン画像です。
image.png

最後に

dtreeviz 実行 → svg出力 → PDF変換 → JPEG変換 →Plotly 表示(→ Dash に反映:記事はPlotly表示まで)... と、かなりの力業となりましたが、ファイル名を決めておけば、自動実行できると思います。
Plotly で画像をズームイン・ズムアウトさせることができるのは、とても便利です。

ただ、もっとスマートにできないものか。。。^_^;
よりよい方法をご存知の方がおられたら、ぜひご教示を。

参考サイト

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?