Matplotlib不能显示中文 — Font family ['sans-serif'] not found警告

Matplotlib不能显示中文和正负号的问题

这两天被这个中文正负号的问题困扰了很久,网上的方法试了好多,然后并没有什么卵用

老规矩开发环境

  • 操作系统:Ubuntu19.10
  • 开发IDE: Pycharm20.1
  • 开发工具:Anaconda
  • python3.7

确定下面的问题前 请确定你的Python代码中有这两句话: Very 重要

    plt.rcParams['font.sans-serif'] = ['SimHei']
    mpl.rcParams['axes.unicode_minus'] = False

遇到的报错(其实是警告)

findfont: Font family [‘sans-serif’] not found. Falling back to DejaVu Sans.
这里是因为Matplotlib 画图的时候使用了中文,而现在这玩意还不支持中文字体,这就很尴尬了
画出来的图emmm就是哪里不太对
Matplotlib不能显示中文 — Font family ['sans-serif'] not found警告_第1张图片
这里的图片x,y轴的名字全框框,坐标系的名字也是框框

注意下面的第一种解决方案,博主实际操作了一下,但是按照这个方案并不能解决博主的问题,可以看第二种解决方案

解决方案(第一种:反正这种我没有解决)

  • 准备工作 下载:simhei.ttf
  • 解压放置一旁准备
  • 在终端下打开python 的环境
>>> import matplotlib
>>> print(matplotlib.matplotlib_fname())
/home/yyy/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc
# matplotlibrc  是个可编辑文件,要去上一级目录的哦

重点是下面

  1. 进入下面目录->将洗净切好的simhei.tff 文件 拷贝到下面的路径下
cd /home/yyy/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/fonts
  1. 然后我们去编辑
 /home/yyy/anaconda3/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc

更改如下内容, 将前面的#号去掉,如果是Ubuntu桌面版本就gedit吧方便, 如果是server版本那就vim不香吗???

font.family         : sans-serif        
font.sans-serif     : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif 
axes.unicode_minus,将True改为False,作用就是解决负号'-'显示为方块的问题   
  1. 然后需要删除缓存配置
cd /home/yyy/.cache 
rm -rf matplotlib

删除缓存再次运行程序据说会有效果,如果不行重启才会有效果,然而, 但是, 依然,-----------
报错(其实是警告)

**findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans.**

多次尝试无效,遂放弃此种骚操作

解决方案(第二种:博主的好用了)

  • 可以逆向思维,为什么第一种方法里要删除缓存,这个缓存目录里有什么东西
cd /home/yyy/.cache/matplotlib
ls
fontlist-v310.json  tex.cache
  • 发现了有意思的东西,有一个字体列表json的文件: fontlist-v310.json
    举例说明:
  "ttflist": [ // 字体列表
    {
      "fname": "fonts/ttf/STIXSizThreeSymBol.ttf", //路径
      "name": "STIXSizeThreeSym", // 字体名称
      "style": "normal",
      "variant": "normal",
      "weight": "bold",
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },   

  • 分析上面的文件,发现自己通过第一种方法返给目录中的simhei.ttf 在这个 json文件里根本找不到。于是乎明白了
  • 继续看文件发现了一个神奇的地方,在文件的后续找到了有绝对路径的字体
    {
      "fname": "/usr/share/fonts/truetype/noto/NotoSerifDevanagari-Regular.ttf", //这个路径很重要划重点这里要考的
      "name": "Noto Serif Devanagari",
      "style": "normal",
      "variant": "normal",
      "weight": 400,
      "stretch": "normal",
      "size": "scalable",
      "__class__": "FontEntry"
    },
  • 然后把洗干净准备好的 simhei.tf (博主里名称改了大写Simhei.tf, 为了跟此目录下的文件统一) 放到 /usr/share/fonts/truetype/noto路径下
    继续删缓存文件
 cd /home/yyy/.cache 
rm -rf matplotlib

然后运行我的 python代码
图片如下所示:中文字符显示正常了,没有了框框好舒服
Matplotlib不能显示中文 — Font family ['sans-serif'] not found警告_第2张图片

  • 再看一下我们 matplotlib 文件目录下的 fontlist-v310.json
    出现了我们导入的字体文件
{
  "fname": "/usr/share/fonts/truetype/noto/Simhei.ttf",  
  "name": "SimHei",
  "style": "normal",
  "variant": "normal",
  "weight": 400,
  "stretch": "normal",
  "size": "scalable",
  "__class__": "FontEntry"
},

收尾 happy–end

  • 有第一种方式好用的麻烦告诉一下,求教一下

你可能感兴趣的:(Matplotlib不能显示中文 — Font family ['sans-serif'] not found警告)