如何在nltk/matplotlib中的图片中显示中文
原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.****.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经常遇到,所以总结下来,希望对你有帮助。这篇文章就到这里了,欢迎大佬们多批评指正,也欢迎大家积极评论多多交流。