matplotlib在red hat服务器上制图中文乱码,显示方块的问题解决

   在项目收尾时测出bug:调用matplotlib 制图时,发现应有的文档图片中没有正常显示中文描述,故产生该问题解决方案

  一. 首先交代使用到工具、库版本

  1)服务器: vi /etc/issue 后如下图所示:

 

  2)python:  py-3.6.5

  3)  虚拟环境: pipenv-2018.11.26

  4)  所用库:matplotlib-2.1.0

  二,错误信息重现

   1)代码保密,所以用一个测试用例代码来展示:

# coding:utf-8

from matplotlib import pyplot as plt
import random

plt.rcParams['font.sans-serif'] = 'SimHei'  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


plt.figure(figsize=(6, 6))
label = ['无记录表', '0记录表', '1~100记录表', '101~1000记录表', '1001~1万记录表', '10001~100万记录表',
         '100万~1000万记录表', '大于1000万记录表']
explode = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
values = [1,2,3,4,5,6,7,8]
plt.pie(values, explode=explode, labels=label, autopct='%1.1f%%')
plt.title('数据表记录数量占比图')  # 绘制标题
plt.savefig('plot_test.png')

 2)错误信息为:

import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

tkinter是Python提供的一个 GUI 库,用于图形处理

3)解决方案:

一眼就可以看出是缺包的问题导致无法绘图,尝试import tkinter(全小写)后,还是报错,

决定看一下matplotlib默认的backend(系统相关的图形环境)相关知识:https://vra.github.io/2017/06/13/mpl-backend/

可以 用以下代码查看:

import matplotlib as pl,

print(pl.get_backend())  

因为包都在虚拟环境中,也可以用这种方式查看:

切到项目开发版本目录下,执行pipenv --venv ,找到matplotlib包的最终目录

例如服务器上:/home/DMATAPP/.local/share/virtualenvs/dmat_ddct_serv-dha5PDyr/lib/python3.6/site-packages/matplotlib

找到该目录下的/mpl-data/matplotlibrc 文件,它是matplotlib的配置文件,默认的backend是Agg,实际设置为TkAgg

于是有了下面的解决办法:在代码头部增加 

import matplotlib as mpl
mpl.use('TkAgg')

重新编译运行,然而还是没有用,最后决定使用其默认的参数:

import matplotlib as mpl
mpl.use('Agg')

4)解释:因为服务器没有装显示相关的包,可以通过设置MPLBACKEN='Agg'解决这个问题,Agg是non-interactive backend,所以不会要求显示图片,所以也不会再报错了。具体可查看:https://vra.github.io/2017/06/13/mpl-backend/

运行。之前的错误没有了,但是出现新的错误:

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

  (prop.get_family(), self.defaultFamily[fontext]))

三.解决方案+说明:

       1) 服务器虚拟环境中matplotlib包的ttf文件目录下是存在中文字体的,但是尝试都不能实现中文正确显示。

       2) 其次,windows下的中文字体和linux字体是可以共用的,这个是前提,所以可从本地拷贝到ttf目录下

       3) 我是用SimHei测试的(黑体),大体步骤如下:

            a.从C:\Windows\Fonts找到SimHei字体,拷贝到matplotlib下的ttf文件夹中

            b.清空matplotlib的缓存,rm -rf ~/.cache/matplotlib/*.cache,直接干掉cache下的matpotlib也可以,我就是这么做的

            c.修改配置文件,上面提到的matplotlibrc文件,修改这三个参数(都是被# 注释掉的)

                font.family         : sans-serif        
                font.sans-serif     : SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, sans-serif     
               # 就是知道字库族为sans-serif,同时添加“SimHei”即黑体到字库族列表中

               axes.unicode_minus: # 将True改为False,作用就是解决负号'-'显示为方块的问题

最后成功解决该问题,如下图所示:

                                                        matplotlib在red hat服务器上制图中文乱码,显示方块的问题解决_第1张图片

参考:https://www.cnblogs.com/lantingg/p/8092940.html 

end:该链接中说要重启电脑,实际上这一步是不需要的(重启一次服务器,代价有点大~)

你可能感兴趣的:(python)