在这里插入图片描述

检测Ubuntu 和 Matplotlib 都可用的中文字体

from matplotlib.font_manager import FontManager
import subprocess
fm = FontManager()
mat_fonts = set(f.name for f in fm.ttflist)
#print(mat_fonts)
output = subprocess.check_output(
    'fc-list :lang=zh -f "%{family}\n"', shell=True) # 获取字体列表
output = output.decode('utf-8')
#print(output)

zh_fonts = set(f.split(',', 1)[0] for f in output.split('\n'))
available = mat_fonts & zh_fonts
print('*' * 10, '可用的字体', '*' * 10)
for f in available:
    print(f)

输出:

********** 可用的字体 **********
WenQuanYi Zen Hei

表示WenQuanYi Zen Hei这个中文字体可用。

如果你检测出没有可用的中文字体,你可以下载SimHei字体,然后将字体移动到matplotlib相关的字体目录中。

  • 下载SimHei字体
wget https://us-logger1.oss-cn-beijing.aliyuncs.com/SimHei.ttf
  • 查看matplotlib安装目录
import matplotlib
# 查了安装路径
print(matplotlib.get_data_path()) 

'''
/root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data

matplotlib字体目录在:/root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/
'''
  • 将下载好的中文字体移动到对应目录
 mv SimHei.ttf /root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/fonts/ttf/

临时使用

# 随便绘制一个饼图
import matplotlib.pyplot as plt
import matplotlib as mpl

font_name = "WenQuanYi Zen Hei"
mpl.rcParams['font.family']= font_name # 指定字体,实际上相当于修改 matplotlibrc 文件 只不过这样做是暂时的 下次失效
mpl.rcParams['axes.unicode_minus']=False # 正确显示负号,防止变成方框
fig1 = plt.figure()  # 先创建一个图像对象
plt.pie([0.5, 0.3, 0.2],  # 值
        labels=['我', '你', '它'],  # 标签
        explode=(0, 0.2, 0),  # (爆裂)距离
        autopct='%1.1f%%',   # 显示百分数格式
        shadow=True)  # 是否显示阴影
plt.show() 

如上所示,在代码中新增了:

mpl.rcParams['font.family']= font_name # 指定字体
mpl.rcParams['axes.unicode_minus']=False # 正确显示负号

永久有效

修改matplotlib设置文件,在mpl-data/matplotlibrc,利用vim打开即可,修改三个地方,修改好后保存即可:

vim /root/miniconda3/envs/myconda/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
# 第一个地方:font.family: sans-serif这一句前面的#去掉
font.family:  sans-serif  
# 第二个地方:在:(冒号)后加一个SimHei
font.sans-serif: SimHei, DejaVu Sans, Bitstream ...
# 第三个地方:axes.unicode_minus后的值改为False
axes.unicode_minus: False

在这里插入图片描述
在这里插入图片描述
修改好后,重启下kernel,最好删除下matplotlib缓存的目录下的配置文件,

# matplotlib缓存的目录 
import matplotlib 
print(matplotlib.get_cachedir())
'''
/root/.cache/matplotlib
'''

后面就可以直接显示中文了。如果后面还想用,记得保存环境
在这里插入图片描述

参考文章

让Matplotlib正确显示中文

Python-matplotlib-中文字体显示和设置

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐