matplotlib中文显示乱码解决方法

Author Avatar
Brian Lee 7月 12, 2018
  • 在其它设备中阅读本文章

在学习《机器学习实战》这本书的决策树一章时,要用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系统下的字体名也不一致,导致了别人的方法对于我不适用。

后来在百般尝试下终于找到了通用的方法:

  1. 使用以下代码查看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)
    

    可显示出所有字体的名字,挑选一个你要使用的中文字体

    字体名

  2. 打开F:\Anaconda\SW\Lib\site-packages\matplotlib\mpl-data下的matplotlibrc文件(路径对应个人情况)

  3. 将如图所示位置前的#去掉

    位置1

  4. 将如图所示位置前的# 去掉,且将SimHei 改为你选好的中文字体名

    位置2

  5. 将如图所示位置的True 改为False

    位置3

  6. 此时中文显示问题就解决了

    解决

本博客采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!
本文链接:http://brianleelxt.top/2018/07/12/plt_font/