74201


dtreevizで日本語のデータを扱いたいのですが、クラス名だけが豆腐になってしまいます。  
解決策をご存じでしょうか。よろしくお願いします。

**環境:**  
google colab

### 手順&コード

①フォントの導入＆キャッシュ削除

[code]

    !apt-get -y install fonts-ipafont-gothic
    !ls /root/.cache/matplotlib
    !rm -r /root/.cache/matplotlib
    
[/code]

②ここでランタイムを再起動  
③dtreevizで可視化

[code]

    from sklearn.datasets import load_iris
    from sklearn import tree
    from dtreeviz.trees import dtreeviz
    
    clf = tree.DecisionTreeClassifier(max_depth=2)
    iris = load_iris()
    clf.fit(iris.data, iris.target)
    
    iris.feature_names = ['sepal 縦 (cm)',
     'sepal 横 (cm)',
     'petal 縦 (cm)',
     'petal 横 (cm)']
    
    iris.target_name = ['setosa_セトーサ',
     'versicolor_バーシカラー',
     'virginica_バージニア']
    
    viz = dtreeviz(
        clf,
        iris.data, 
        iris.target,
        target_name='variety',
        feature_names=iris.feature_names,
        class_names=iris.target_name ,
        fontname='IPAPGothic'
    ) 
    
    display(viz)
    
[/code]

[![出力画像](https://i.stack.imgur.com/F1Gr3.png)](https://i.stack.imgur.com/F1Gr3.png)


CC BY-SA 4.0
2021-02-22T03:07:10.130
74192
2021-02-22T09:13:55.017
2021-02-22T04:23:44.260
44067
44067
question
python matplotlib 文字化け
dtreevizを日本語表記にする際、クラス名だけが文字化けしてしまう


原因は
[dtreeviz/trees.py](https://github.com/parrt/dtreeviz/blob/master/dtreeviz/trees.py#L1061)
で `draw_pichart()` 呼び出しの際に `fontname` を指定していないからです(デフォルトの `Arial`
フォントが使用される事になります)。

以下は `fontname` の指定を追加する差分コードになります。

[code]

    $ diff -u trees.py.org trees.py
    --- trees.py.org    2021-02-22 12:42:23.000000000 +0900
    +++ trees.py    2021-02-22 17:43:04.221405758 +0900
    @@ -825,7 +825,7 @@
             if shadow_tree.is_classifier():
                 class_leaf_viz(node, colors=color_values,
                                filename=f"{tmp}/leaf{node.id}_{os.getpid()}.svg",
    -                           graph_colors=colors)
    +                           graph_colors=colors, fontname=fontname)
                 leaves.append(class_leaf_node(node))
             else:
                 # for now, always gen leaf
    @@ -1042,7 +1042,8 @@
     def class_leaf_viz(node: ShadowDecTreeNode,
                        colors: List[str],
                        filename: str,
    -                   graph_colors=None):
    +                   graph_colors=None,
    +                   fontname: str = "Arial"):
         graph_colors = adjust_colors(graph_colors)
         # size = prop_size(node.nsamples(), counts=node.shadow_tree.leaf_sample_counts(),
         #                  output_range=(.2, 1.5))
    @@ -1059,7 +1060,7 @@
         counts = node.class_counts()
         prediction = node.prediction_name()
         draw_piechart(counts, size=size, colors=colors, filename=filename, label=f"n={nsamples}\n{prediction}",
    -                  graph_colors=graph_colors)
    +                  graph_colors=graph_colors, fontname=fontname)
    
[/code]

[![実行結果](https://i.stack.imgur.com/sa9X2.png)](https://i.stack.imgur.com/sa9X2.png)

※ Issue として報告しておくとよいかもしれません。


CC BY-SA 4.0
2021-02-22T09:13:55.017
74201
2021-02-22T09:13:55.017
74192
answer