在学习《机器学习实战》这本书的决策树一章时,要用matplotlib画出决策树,然而在显示中文时出现了乱码
import matplotlib.pyplot as plt
#定义文本框和箭头格式
decisionNode = dict(boxstyle = "sawtooth", fc = "0.8")
leafNode = dict(boxstyle = "round4", fc = "0.8")
arrow_args = dict(arrowstyle = "<-")
def plotNode(nodeTxt, centerPt, parentPt, nodeType):
createPlot.ax1.annotate(nodeTxt, xy = parentPt, xycoords = 'axes fraction', xytext = centerPt, textcoords = 'axes fraction',
va = "center", ha="center", bbox = nodeType, arrowprops = arrow_args)
def createPlot():
fig = plt.figure(1, facecolor = 'white')
fig.clf()
createPlot.ax1 = plt.subplot(111, frameon = False)
plotNode('决策节点', (0.5, 0.1), (0.1, 0.5), decisionNode)
plotNode('叶节点', (0.8, 0.1), (0.3, 0.8), leafNode)
plt.show()
def main():
createPlot()
main()
上网查了很多方法都不管用,后来发现最根本的问题是字体名字要正确。由于别人的字体我没有,且matplotlib的font_manager中的字体名与Windows系统下的字体名也不一致,导致了别人的方法对于我不适用。
后来在百般尝试下终于找到了通用的方法:
-
使用以下代码查看matplotlib的font_manager下的字体名字
from matplotlib.font_manager import fontManager import os fonts = [font.name for font in fontManager.ttflist if os.path.exists(font.fname) and os.stat(font.fname).st_size>1e6] for font in fonts: print(font)
可显示出所有字体的名字,挑选一个你要使用的中文字体
-
打开
F:AnacondaSWLibsite-packagesmatplotlibmpl-data
下的matplotlibrc文件(路径对应个人情况) -
将如图所示位置前的
#
去掉 -
将如图所示位置前的
#
去掉,且将SimHei
改为你选好的中文字体名 -
将如图所示位置的
True
改为False
-
此时中文显示问题就解决了