:详解Matplotlib中文字符显示问题-经验观点免费ppt模版下载-道格办公

详解Matplotlib中文字符显示问题

在Matplotlib中解决中文字符显示问题有多种方法。以下是几种常用的解决方案: 1. 使用系统内置的中文字体:Matplotlib会使用默认的字体进行绘图,但默认字体可能不支持中文字符。可以通过设置系统内置的中文字体来解决显示问题。以下是一个示例: ```python import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体为中文字体 plt.rcParams['axes.unicod

在用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:UsersGdcanaconda3libsite-packagesmatplotlibackendsackend_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:windowsfontsSimHei.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:UsersGdcanaconda3libsite-packagesmatplotlibmpl-datamatplotlibrc

在以下地方#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




往期推荐

  • Pandas处理字典和json数据的几个方法

  • 王者荣耀五周年,带你入门Python爬虫基础操作(102个英雄+326款皮肤).



 默默关注才哥

然后惊艳所有人

可以叫我才哥


                 我就知道你在看!

文章为用户上传,仅供非商业浏览。发布者:Lomu,转转请注明出处: https://www.daogebangong.com/articles/detail/Detailed%20explanation%20of%20Matplotlib%20Chinese%20character%20display%20problem.html

(810)
打赏 支付宝扫一扫 支付宝扫一扫
single-end

相关推荐