导航

matplotlib绘图中文乱码问题

Posted on 2023-03-05 10:10  蝈蝈俊  阅读(2103)  评论(0编辑  收藏  举报

在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告:

UserWarning: Glyph 36724 (\N{CJK UNIFIED IDEOGRAPH-8F74}) missing from current font.

警告信息中提示“missing from current font”,直译就是“在当前字体中缺少(中文字符)”,大概含义就是默认的字体中不含中文字符。

同时中文字符显示为方框或乱码的形式,如下图。

对应代码

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 3 * np.pi, 50)
y = np.sin(x)

设置线宽

plt.figure(figsize=(10,4))
plt.plot(x, y, linewidth=4,label=u'正弦函数 sin')
plt.legend()

设置图表标题,并给坐标轴添加标签

plt.title("sin函数图", fontsize=12)
plt.xlabel("x轴", fontsize=12)
plt.ylabel("y轴", fontsize=12)

plt.grid(True, linestyle='-', alpha=0.5)

设置坐标轴刻度标记的大小

plt.tick_params(axis='both', labelsize=12)
for a, b in zip(x, y):
plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

plt.show()

对于上面这类问题,核心就是设置绘制图片用到的中文字体参数。

在绘图代码中设置全局字体

mac电脑默认没有SimHei(黑体)字体,大家可以下载安装该字体或者修改为系统自带的字体如Arial Unicode MS。

rcParams方法

在前面增加下面代码。


from pylab import mpl

设置显示中文字体,

设置font.sans-serif 或 font.family 均可

mpl.rcParams["font.sans-serif"] = ["Arial Unicode MS"] ## mac

plt.rcParams['font.family']=['Arial Unicode MS'] ## mac

mpl.rcParams["font.sans-serif"] = ["SimHei"] ## win

plt.rcParams['font.family']=['SimHei'] ## win

设置正常显示符号

mpl.rcParams["axes.unicode_minus"] = False

font.family的默认是font.sans-serif,所以上面两个设置都可以。

rc方法

rc方法,其实和设置rcParams 基本等效


# 设置font字典为 SimSun(宋体),大小为12(默认为10)
font = {'family' : 'SimSun',
        'size'  : '12'}

设置 字体

plt.rc('font', **font)

解决中文字体下坐标轴负数的负号显示问题

plt.rc('axes', unicode_minus=False)

局部设置

这里我们演示加载自己的字体文件,设置指定的字体。

比如:
思源黑体是 Adobe 与 Google 推出的一款开源字体。

官网:https://source.typekit.com/source-han-serif/cn/

GitHub 地址:https://github.com/adobe-fonts/source-han-sans/tree/release/OTF/SimplifiedChinese

我这里用的是 SourceHanSansSC-Bold.otf

演示代码


import matplotlib
import matplotlib.pyplot as plt
import numpy as np

myfont = matplotlib.font_manager.FontProperties(fname=r"SourceHanSansSC-Bold.otf", size=14)

x = np.linspace(0, 3 * np.pi, 50)
y = np.sin(x)

设置线宽

plt.figure(figsize=(10,4))
plt.plot(x, y, linewidth=4,label=u'正弦函数 sin')
plt.legend()

设置图表标题,并给坐标轴添加标签

plt.title("sin函数图", fontproperties = myfont)
plt.xlabel("x轴", fontproperties = myfont)
plt.ylabel("y轴", fontproperties = myfont)

plt.grid(True, linestyle='-', alpha=0.5)

设置坐标轴刻度标记的大小

plt.tick_params(axis='both', labelsize=12)
for a, b in zip(x, y):
plt.text(a, b, b, ha='center', va='bottom', fontsize=10)

plt.show()

执行效果

注意,我们看到plt.plot(这个函数没法设置字体的参数,我们无法通过上述方式设置标签对应的字体。

总结

matplotlib 中使用的字体来源于三个途径:

  1. matplotlib 自带的字体;
  2. 操作系统自带字体;
  3. 用户提供的第三方字体。

我们可以通过全局设置和局部设置来控制。