window系統sklearn決策樹graphviz繪圖中文亂碼解決方法

(一)主要思路

下面說一下解決方法,先貼出來運行成功的代碼(用的解釋器是jupyter notebook):

from sklearn.externals.six import StringIO

import pydotplus

from IPython.display import Image

dot_data = StringIO()

tree.export_graphviz(clf, out_file=dot_data,

feature_names=feature_names,

class_names=class_names,

filled=True, rounded=True,

special_characters=True)

graph = pydotplus.graph_from_dot_data(dot_data.getvalue().replace(‘helvetica’,’“Microsoft YaHei”’))

Image(graph.create_png())

重點在這一句graph = pydotplus.graph_from_dot_data(dot_data.getvalue().replace(‘helvetica’,’“Microsoft YaHei”’)) (其他的代碼都是比較標準的一般代碼,具體含義自己可以查閱相關資料瞭解),這一句代碼的一般代碼是graph = pydotplus.graph_from_dot_data(dot_data.getvalue())) ,我在這個標準代碼的基礎上對其中的dot_data.getvalue()進行了一下處理,將dot_data.getvalue()的結果進行了一下替換。原因是我運行dot_data.getvalue()之後,得到的是’digraph Tree {\nnode [shape=box, style=“filled, rounded”, color=“black”, fontname=helvetica] ;\nedge [fontname=helvetica] ;\n0 [label=…’,因爲看其他解決方法裏有說到可能是字體的原因導致亂碼,英文字體不能兼容中文,所以注意到其中兩個fontname=helvetica,這裏表示不知道helvetica是什麼字體,但看着不像中文字體,考慮將helvetica替換爲Microsoft YaHei(微軟雅黑),但是運行報錯。此時想起有的解法方法中提到graphviz中一個字符串中如果有空格,需要用引號括起來,從而保證graphviz識別爲一個字符串,最終決定將helvetica替換爲"Microsoft YaHei"(注意雙引號),最後運行成功了!!!

(二)graphviz的字體配置文件的修改

如果以上操作沒能解決中文亂碼的問題,需要首先修改一下graphviz安裝包中的字體配置文件。我的操作如下(參考一些網上答案的):

根據graphviz的安裝路徑(我安裝的是graphviz),找到類似C:\Program Files (x86)\Graphviz2.38\etc\fonts的目錄,將其中的fonts.conf拷貝到其他路徑下。如D:\,然後用記事本打開,找到<dir>#FONTDIR#</dir>(這裏注意在原安裝目錄下fonts.conf文件中這句代碼不是這樣的,好像是<dir>#WINSOWSFONTDIR#</dir>,但是將文件拷貝出來之後會變成<dir>#FONTDIR#</dir>,我是因爲在安裝目錄下修改不成功,拷貝出來修改才發現的)將其改爲<dir>C:\WINDOWS\Fonts</dir>,保存,然後將修改的fonts.conf文件替換安裝目錄下的fonts.conf。修改graphviz的字體配置文件完成,然後再進行前面的步驟即可。

這個解決方案是在英文變量名、label名等運行正確基礎上,但是中文變量名、label名等顯示亂碼的解決方法,如果是英文變量名、label名等運行都有問題,請參考其他解決方法。先到這裏了,有啥不正確的地方,敬請指正。
注:本文也在知乎寫過。

原文鏈接:https://blog.csdn.net/qq_39386012/article/details/83857609

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章