matplotlib绘图中文乱码问题

简介: matplotlib绘图中文乱码问题

在用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()

对于上面这类问题,核心就是设置绘制图片时的字体参数包含全部的需要用到的字符。

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

macSimHei(黑体)字体,大家可以下载安装该字体或者修改为系统自带的字体如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. 用户提供的第三方字体。

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

相关文章
|
1月前
|
数据可视化 数据挖掘 大数据
【数据分析与可视化】Matplotlib绘图基础语法讲解(图文解释 超详细)
【数据分析与可视化】Matplotlib绘图基础语法讲解(图文解释 超详细)
74 0
|
1月前
|
资源调度 自然语言处理 数据可视化
【数据分析与可视化】Matplotlib中十大绘图模型的讲解及实现(图文解释 附源码)
【数据分析与可视化】Matplotlib中十大绘图模型的讲解及实现(图文解释 附源码)
86 1
|
5天前
|
Python
【随手记】贴一段matplotlib绘图的多图拼接代码
【随手记】贴一段matplotlib绘图的多图拼接代码
26 1
|
1月前
|
机器学习/深度学习 数据可视化 数据挖掘
Python绘图工具Matplotlib安装与使用,快速上手
Python绘图工具Matplotlib安装与使用,快速上手
|
1月前
|
数据采集 前端开发 C++
Python通过matplotlib动态绘图实现中美GDP历年对比趋势动图
随着中国的各种实力的提高,经常在各种媒体上看到中国与各个国家历年的各种指标数据的对比,为了更清楚的展示历年的发展趋势,有的还做成了动图,看到中国各种指标数据的近年的不断逆袭,心中的自豪感油然而生。今天通过Python来实现matplotlib的动态绘图,将中美两国近年的GDP做个对比,展示中国GPD对美国的追赶态势,相信不久的将来中国的GDP数据将稳超美国。
74 2
|
8月前
|
数据可视化 Python
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
【100天精通Python】Day65:Python可视化_Matplotlib3D绘图mplot3d,绘制3D散点图、3D线图和3D条形图,示例+代码
228 0
|
1月前
|
机器学习/深度学习 数据可视化 API
Matplotlib从入门到精通01-matplotlib简介与绘图基本流程
Matplotlib从入门到精通01-matplotlib简介与绘图基本流程
Matplotlib从入门到精通01-matplotlib简介与绘图基本流程
|
1月前
|
机器学习/深度学习 资源调度 数据挖掘
数据挖掘与机器学习中Matplotlib绘图模块详细讲解(超详细 附源码)
数据挖掘与机器学习中Matplotlib绘图模块详细讲解(超详细 附源码)
76 0
|
1月前
|
Python
Matplotlib.pyplot绘图示例
Matplotlib.pyplot绘图示例
38 0
|
8月前
|
数据可视化 关系型数据库 Python
【100天精通Python】Day66:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码
【100天精通Python】Day66:Python可视化_Matplotlib 3D绘图,绘制3D曲面图、3D填充图,3D极坐标图,示例+代码
143 0