在用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 中使用的字体来源于三个途径:
- matplotlib 自带的字体;
- 操作系统自带字体;
- 用户提供的第三方字体。
我们可以通过全局设置和局部设置来控制。