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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/cc411689-3ad3-0ac9-9cf7-4aa5ad337a00.png)
## はじめに
[**dtreeviz**](https://github.com/parrt/dtreeviz)で描いたデシジョンツリーは本当にきれいです。
[**dtreeviz**](https://github.com/parrt/dtreeviz)で実行したデシジョンツリーは、セルに表示させることも、画像として保存することもできます。

基本は、これで事足りるのですがが、できれば[**dtreeviz**](https://github.com/parrt/dtreeviz)のデシジョンツリー画像をPlotlyで表示させたくなりました。
大きなサイズのデシジョンツリーほど、全体を見て⇔部分を見てということを繰り返します。[**Plotly**](https://pypi.org/project/plotly-express/) で表示させた画像は、ズームイン・ズームアウトがインタラクティブにできますので きっと便利だろうということと、デシジョンツリー画像を Dashによるダッシュボードに反映できるようになるからです。

[**dtreeviz**](https://github.com/parrt/dtreeviz)で保存できる画像形式は **svg** 。
この画像形式のままでは（この記事を書いている時点では）[**Plotly**](https://pypi.org/project/plotly-express/) で表示できませんので、すこし力業的な実行となりましたが、画像形式を **JPEG** に変換し、対応しました。

　
## 実行条件など

>- **Google colab**で実行


## aspose.words によるJPEG変換
[**aspose.words**](https://pypi.org/project/aspose-words/) は、さまざまなdocumentや画像形式 の変換に対応したライブラリです。
変換だけではなく、生成、変更、レンダリング、印刷などの機能もあるようです。

以下は、[**aspose.words**](https://pypi.org/project/aspose-words/) による svg → jpeg の実行コードです。
[**dtreeviz**](https://github.com/parrt/dtreeviz) の決定木画像（ファイル名：Decission_tree_result.svg）を読み込み、「Output.jpeg」に出力させています。
ファイル名は任意に変更してください。

```Python:
!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で表示させます。
無事に実行できましたが、すこし解像度があらいので、すこし見づらいかなというところです。
```Python:
import plotly.express as px
from skimage import io
img = io.imread('Output.jpeg')
fig = px.imshow(img)
fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/aa819caf-c5c1-8cc0-1bce-bfe6baa7b7b2.png)

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

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

このため、力業的となりますが、
>1. [**svglib**](https://pypi.org/project/svglib/) で、svg → PDF を実行。
>2. [**pdf2image**](https://pypi.org/project/pdf2image/) で、PDF → JPEG を実行。

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


まず、 [**svglib**](https://pypi.org/project/svglib/) で svg → PDF変換を実行しました。
```Python:
!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**](https://pypi.org/project/poppler-utils/) と [**pdf2image**](https://pypi.org/project/pdf2image/) をインストールし、
```Python:
!apt-get install poppler-utils
!pip install pdf2image
```

PDF → JPEG変換の前に、PDFをセルに表示させました。
解像度も悪くありません。
Google Colabで、セルにPDF表示させたい場合は、これはこれで便利です。
```Python:
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/05c98274-40b1-b689-f10c-2248b29549b9.png)


PDF → JPEG変換です。ファイル名（'Decission_tree_result.jpg）と変換形式（’JPEG’）を指定して実行しています。
images内に複数の画像があること想定したコードとなっています。#にある **+str(i)** をコードに加えると、ファイル名のあとに連番がつきます。
今回は、1枚の画像を読むだけなので **+str(i)** は除いています。

```Python:
for i in range(len(images)):
    images[i].save('Decission_tree_result'+'.jpg', 'JPEG')
#  images[i].save('file_name'+str(i)+'.jpg', 'JPEG')
```

最後に[**Plotly**](https://pypi.org/project/plotly-express/) 表示です。
```Python:
import plotly.express as px
from skimage import io
img = io.imread('Decission_tree_result.jpg')
fig = px.imshow(img)
fig.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/e55069e0-8154-efcc-ece4-b83097df43da.png)

以下は、ズームイン画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1275001/a283bc91-737f-f5c0-f0af-1221e56d31e8.png)



## 最後に
[**dtreeviz**](https://github.com/parrt/dtreeviz) 実行 → svg出力 → PDF変換 → JPEG変換 →[**Plotly**](https://pypi.org/project/plotly-express/) 表示（→ Dash に反映：記事はPlotly表示まで）... と、かなりの力業となりましたが、ファイル名を決めておけば、自動実行できると思います。
[**Plotly**](https://pypi.org/project/plotly-express/) で画像をズームイン・ズムアウトさせることができるのは、とても便利です。

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


## 参考サイト

https://colab.research.google.com/drive/10doc9xwhFDpDGNferehBzkQ6M0Un-tYq

https://www.tutorialguruji.com/python/display-a-pdf-file-using-colab/

https://geeksqa.com/display-a-pdf-file-using-colab