如何在nltk/matplotlib中的图片中显示中文

原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080


一、问题描述

首先来看一下问题描述:
我要验证的内容是Zipf’s Law:

# -*- coding: utf-8 -*-
from nltk import FreqDist

f = open('C:/Users/Administrator/Desktop/novel.txt', 'r',encoding = 'utf-8')  # 打开小说
string = f.read()
f.close()
words = []

for word in string:
    if word >= u'\u4e00' and word <= u'\u9fff':  # 判断是否为汉字
        words.append(word)
fdist = FreqDist(words)
#a = sorted(fdist)
for key in fdist:
    print(key,fdist[key])
fdist.plot(10)

显示结果为:
 


在这里插入图片描述

统计的中文汉字没有显示出来,应该出现的目的结果为:
 

在这里插入图片描述

二、问题解决

2.1 出现问题的原因

原因在于nltk中的plt其实是调用的是matplotlib中的plot。

matplotlib 从配置文件 matplotlibrc 中读取配置,字体相关内容也在其中。matplotlib 依次在以下四个位置寻找配置文件:

  • 当前工作目录下的 matplotlibrc。
  • $MATPLOTLIBRC/matplotlibrc。
  • 用户家目录下的 matplotlibrc。 如 Linux 一般在 ~/.config/matplotlib/matplotlibrc, macOS 在 ~/.matplotlib/matplotlibrc。
  • INSTALL/matplotlib/mpl-data/matplotlibrc,其中 INSTALL 指具体的安装目录。

2.2 查询matplotlib配置文件位置

可以查询出配置文件以及当前使用的字体方式。可以看出使用的字体是/DejaVuSans.ttf, 这个文件不是中文的。

from matplotlib.font_manager import findfont,FontProperties
if __name__=="__main__":
    #print(matplotlib.get_configdir())
    print(findfont(FontProperties(family=FontProperties().get_family())))

结果:

D:\Python3.7\python.exe C:/Users/Administrator/PycharmProjects/practice1/1.py
D:\Python3.7\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\DejaVuSans.ttf

找到对应的文件夹,发现里面并没有SimHei.ttf这个文件。
 


在这里插入图片描述

现在如果想要显示中文,其中一个很重要的步骤就是将SimHei.ttf这个文件拷贝到这个文件夹中。如果你电脑上安装了word或者是WPS,肯定会有这个SimHei.ttf这个文件。如果没有,下载一个拷贝到D:\Python3.7\Lib\site-packages\matplotlib\mpl-data\fonts\ttf。
我的电脑上下载了word,所以通过在资源管理器中搜索SimHei.ttf就可以找到这个文件。
 


在这里插入图片描述

2.3更改matplotlibrc文件内容

mpl-data目录下有matplotlib的配置文件matplotlibrc。进入编辑,在font.sans-serif中将SimHei设置为第一个也就是最高优先级。
 


在这里插入图片描述

一定要记得将前面的#号打开,让这行代码可以运行。这样工作就完成了。如果还是不行,还需要清除matplotlib中的缓存,最简单的办法就是关闭PyCharm然后再打开。最终结果如图:
 

在这里插入图片描述

三、总结

这篇文章涉及的问题在使用matplotlib经常遇到,所以总结下来,希望对你有帮助。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。
 

 
在这里插入图片描述