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

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