python graphviz中文乱码_window系统sklearn决策树graphviz绘图中文乱码解决方法

最近因为工作需要,要用决策树提取一些规则,但是我之前整理的宽表变量名称都是中文,而且目标(标签label)取值也是中文。在jupyter notebook里写了常规代码运行之后,发现中文显示不出来,显示为框框。然后就在网上找一些解决方法,但是不是没说明白,就是很麻烦(要各种编码解码)。所以,自己综合了一些网上的答案,并根据中间结果,摸索出一个简单有效的解决方法,分享一下,如果不对的地方,敬请谅解。

(一)主要思路

下面说一下解决方法,先贴出来运行成功的代码(用的解释器是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:\,然后用记事本打开,找到

(这里注意在原安装目录下fonts.conf文件中这句代码不是这样的,好像是,但是将文件拷贝出来之后会变成,我是因为在安装目录下修改不成功,拷贝出来修改才发现的)将其改为,保存,然后将修改的fonts.conf文件替换安装目录下的fonts.conf。修改graphviz的字体配置文件完成,然后再进行前面的步骤即可。

这个解决方案是在英文变量名、label名等运行正确基础上,但是中文变量名、label名等显示乱码的解决方法,如果是英文变量名、label名等运行都有问题,请参考其他解决方法。先到这里了,有啥不正确的地方,敬请指正。

你可能感兴趣的:(python,graphviz中文乱码)