查看原文
其他

详解Matplotlib中文字符显示问题

才哥 可以叫我才哥 2021-10-08


在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,我们这里将介绍多种解决方案。


02

目录:

  • 1.中文字体显示问题

  • 2.几种解决方案

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

    • 2.2.在绘图代码中设置局部字体

    • 2.3.修改本机字符默认配置字体

    • 2.4.自动区别系统然后选择字体

  • 3.其他

    • 3.1.platform模块

    • 3.2.常见中文字体文件名

1.中文字体显示问题

在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,具体见下方案例:

import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(-1.01.00.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel='时间 (s)', ylabel='voltage (mV)',
       title='简单的标题')

plt.show()
中文乱码
C:\Users\Gdc\anaconda3\lib\site-packages\matplotlib\backends\backend_agg.py:238: RuntimeWarning: Glyph 31616 missing from current font.
  font.set_text(s, 0.0, flags=flags)
...

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

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

2.几种解决方案

我们在解决中文字符显示问题时,有两类方案多种方式:方案1,在绘图代码中设置全局字符显示字体;方案2,在绘图代码中设置局部字体;方案3,修改本机字符默认配置的字体。

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

rcParams修改 font.sans-seriffont.family 对应字体

# 以下代码从全局设置字体为SimHei(黑体),解决显示中文问题【Windows】
# 设置font.sans-serif 或 font.family 均可
plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.rcParams['font.family']=['SimHei']
# 解决中文字体下坐标轴负数的负号显示问题
plt.rcParams['axes.unicode_minus'] = False 

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

# 以下代码从全局设置字体为Arial Unicode MS,解决显示中文问题【mac】
# 设置font.sans-serif 或 font.family 均可
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# plt.rcParams['font.family']=['Arial Unicode MS']
# 解决中文字体下坐标轴负数的负号显示问题
plt.rcParams['axes.unicode_minus'] = False 

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

# 设置font字典为 SimSun(宋体),大小为12(默认为10)
font = {'family' : 'SimSun',
        'size'  : '12'}
# 设置 字体
plt.rc('font', **font)
# 解决中文字体下坐标轴负数的负号显示问题        
plt.rc('axes', unicode_minus=False

!! 比如:rc('lines', linewidth=2, color='r')等效于以下:

rcParams['lines.linewidth'] = 2
rcParams['lines.color'] = 'r'

2.2.在绘图代码中设置局部字体

FontProperties对象,这种情况下 不需要额外 处理负号 问题

import matplotlib.pyplot as plt
import numpy as np
# 引入matplotlib字体管理 FontProperties
from matplotlib.font_manager import FontProperties

# 设置我们需要用到的中文字体(字体文件地址)
my_font = FontProperties(fname=r"c:\windows\fonts\SimHei.ttf", size=12)
# Data for plotting
t = np.arange(-1.01.00.01)
s = 1 + np.sin(2 * np.pi * t)

plt.plot(t, s)

# 设置 x轴名称字体
plt.xlabel('时间 (s)', fontproperties=my_font)
plt.ylabel('voltage (mV)')
# 设置 标题字体
plt.title('简单的标题', fontproperties=my_font)

plt.show()
FontProperties对象

直接设置fontproperties参数,这种情况下 也不需要额外 处理负号 问题

import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(-1.01.00.01)
s = 1 + np.sin(2 * np.pi * t)

plt.plot(t, s)

# 设置 x轴名称字体 黑体 SimHei
plt.xlabel('时间 (s)', fontproperties='SimHei')
plt.ylabel('voltage (mV)')
# 设置 标题字体 微软雅黑 Microsoft YaHei
plt.title('简单的标题', fontproperties='Microsoft YaHei')

plt.show()
fontproperties参数

2.3.修改本机字符默认配置字体

除了以上的在代码中进行字体设置外,我们还可以直接修改本机字符默认配置字体,不过这种情况下代码只在本机适用咯。

In [1]: # 查看配置地址
   ...: import matplotlib
   ...: print(matplotlib.matplotlib_fname())
C:\Users\Gdc\anaconda3\lib\site-packages\matplotlib\mpl-data\matplotlibrc

在以下地方#font.sans-serif新增支持中文字符的字体如:SimSun(宋体),也可以直接修改#font.family:  SimSun

!! #font.family:  sans-serif #font.sans-serif: SimSun,

考虑到 中文字体下 负号的显示问题,同步需要修改#axes.unicode_minus: False

修改True为False

2.4.自动区别系统然后选择字体【方便】

核心是以下代码:

(引用platform模块获取当前系统 mac or windows ,然后自动选择相应中文字体)

# 根据不同的操作系统设置对应的中文字体(苹果系统和Windows系统)system_font = {"Darwin": "Arial Unicode MS", "Windows": "SimHei"}plt.rcParams['font.family'] = [system_font.get(platform.system())]


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

# 根据不同的操作系统设置对应的中文字体(苹果系统和Windows系统)
system_font = {"Darwin""Arial Unicode MS""Windows""SimHei"}
plt.rcParams['font.family'] = [system_font.get(platform.system())]
# 解决中文字体下坐标轴负数的负号显示问题
plt.rcParams['axes.unicode_minus'] = False 

# Data for plotting
t = np.arange(-1.01.00.01)
s = 1 + np.sin(2 * np.pi * t)

fig, ax = plt.subplots()
ax.plot(t, s)

ax.set(xlabel='时间 (s)', ylabel='voltage (mV)',
       title='简单的标题')

plt.show()
中文字符显示

3.其他

这里我们简单介绍获取操作系统相关信息的模块platform和常见的中文字体的字体文件名信息,方便大家理解!

3.1.platform模块

platform模块给我们提供了很多方法去获取操作系统的相关信息。

!! 参考文档:https://docs.python.org/3/library/platform.html

In [1]: import platform

In [2]: platform.system()
Out[2]: 'Windows'

In [3]: platform.platform()
Out[3]: 'Windows-10-10.0.18362-SP0'

In [4]: platform.version()
Out[4]: '10.0.18362'

In [5]: platform.architecture()
Out[5]: ('64bit''WindowsPE')

In [6]: platform.machine()
Out[6]: 'AMD64'

In [7]: platform.node()
Out[7]: 'Gdc-PC'

In [8]: platform.processor()
Out[8]: 'Intel64 Family 6 Model 94 Stepping 3, GenuineIntel'

In [9]: platform.uname()
Out[9]: uname_result(system='Windows', node='Gdc-PC', release='10', version='10.0.18362', machine='AMD64', processor='Intel64 Family 6 Model 94 Stepping 3, GenuineIntel')

3.2.常见中文字体文件名

中文字体字体文件名称
宋体SimSun
黑体SimHei
微软雅黑Microsoft YaHei
微软正黑体Microsoft JhengHei
新宋体NSimSun
新细明体PMingLiU
细明体MingLiU
标楷体DFKai-SB
仿宋FangSong
楷体KaiTi
隶书LiSu
幼圆YouYuan
华文细黑STXihei
华文楷体STKaiti
华文宋体STSong
华文中宋STZhongsong
华文仿宋STFangsong
方正舒体FZShuTi
方正姚体FZYaoti
华文彩云STCaiyun
华文琥珀STHupo
华文隶书STLiti
华文行楷STXingkai
华文新魏STXinwei




往期推荐



 默默关注才哥

然后惊艳所有人

可以叫我才哥



                 我就知道你在看!
: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存