前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解Matplotlib中文字符显示问题

详解Matplotlib中文字符显示问题

作者头像
可以叫我才哥
发布于 2021-08-05 03:36:13
发布于 2021-08-05 03:36:13
3.9K00
代码可运行
举报
文章被收录于专栏:可以叫我才哥可以叫我才哥
运行总次数:0
代码可运行
在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,我们这里将介绍多种解决方案。

02

目录:

  • 1.中文字体显示问题
  • 2.几种解决方案
    • 2.1.在绘图代码中设置全局字体
    • 2.2.在绘图代码中设置局部字体
    • 2.3.修改本机字符默认配置字体
    • 2.4.自动区别系统然后选择字体
  • 3.其他
    • 3.1.platform模块
    • 3.2.常见中文字体文件名

1.中文字体显示问题

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(-1.0, 1.0, 0.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()

中文乱码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 对应字体

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以下代码从全局设置字体为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,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 以下代码从全局设置字体为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 基本等效

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 设置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')等效于以下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rcParams['lines.linewidth'] = 2
rcParams['lines.color'] = 'r'

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.0, 1.0, 0.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参数,这种情况下 也不需要额外 处理负号 问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np

# Data for plotting
t = np.arange(-1.0, 1.0, 0.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.修改本机字符默认配置字体

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 ,然后自动选择相应中文字体)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 根据不同的操作系统设置对应的中文字体(苹果系统和Windows系统)
system_font = {"Darwin": "Arial Unicode MS", "Windows": "SimHei"}
plt.rcParams['font.family'] = [system_font.get(platform.system())]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.0, 1.0, 0.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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 可以叫我才哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Matplotlib绘图中文乱码,完整解决方法总结!
在使用Matplotlib进行绘图时,中文字体可能会显示为乱码,因为Matplotlib默认的字体不支持中文。为了在图表中正确显示中文,你需要进行一些额外的配置。以下是一个解决方案,它包括设置Matplotlib以使用支持中文的字体:
double
2024/04/11
6.1K0
Matplotlib绘图中文乱码,完整解决方法总结!
Matplotlib支持中文显示的两种方法
在默认情况下,Matplotlib在设置title和标注text时如果使用中文,会出现尴尬的框框。
lyhue1991
2021/06/15
1.4K0
Python实现matplotlib显示中文的方法详解
方式二用时才设置,且不会污染全局字体设置,更灵活 方式三、方式四不需要对字体路径硬编码,而且一次设置,多次使用,更方便。
用户7718188
2021/10/08
1.1K0
matplotlib绘图技巧详解(一)
我们之前已经讲述了matplotlib的绘图原理,陆续会更新绘图技巧、相关图形绘制。
朱小五
2020/03/03
9450
matplotlib绘图技巧详解(一)
matplotlib中文乱码的两种解决方案
今天遇到一个问题就是:当我给坐标轴添加一些中文内容以便客户查看时,出现了乱码,接下来我就通过两种方法对乱码的问题做一下解释。
石璞东
2020/08/18
25K0
matplotlib中文乱码的两种解决方案
解决Python使用matplotlib绘图时出现的中文乱码问题
Python 中使用 matplotlib 绘图时发现控制台报如下问题,可知是中文字体问题:
AI悦创
2021/09/15
11K0
解决使用matplotlib.pyplot画图 中文乱码和负号无法显示 问题
一、临时解决matplotlib画图中文乱码问题(也有可能解决不了,解决不了看方法二)
Chuanrui 初见之旅
2023/10/18
9780
【python绘图】matplotlib基本使用(含实例)
matplotlib是python的绘图库,主要用来绘制二维平面图。上手容易、简单,在python数据分析中有非常重要的作用。 基本上有两种使用 Matplotlib 的方法: 一、依靠 pyplot 自动创建和管理图形和轴,并使用 pyplot 函数进行绘图。 二、显式创建图形和轴,并在它们上调用方法(即“面向对象 (OO) 样式”)。
Crayon鑫
2023/10/10
1.5K0
【python绘图】matplotlib基本使用(含实例)
如何用python画图--matplotlib实例与补充
在第一篇文章中,大家一定看到了包含Figure,Axes,Axis等的代码,可能会一头雾水,不知道这些分别表示什么。这里就给大家仔细解释一下。掌握了这些之后,绘图就游刃有余啦。
MeteoAI
2019/07/24
1.5K0
软件测试|matplotlib中文不显示的解决方案
当我使用matplotlib结合wordcloud,jieba绘制词云图时,发现我的代码在没有任何报错的情况下,输出的图是下面这样的,我想了很多办法都不顶用,包括改编码方式等等,后面一查,是matplotlib默认不输出中文的原因,当然,遇到问题,就需要去找到解决问题的办法。功夫不负有心人,终于还是找到了几个办法,现在分享给大家。
霍格沃兹测试开发Muller老师
2023/02/19
6110
python绘图显示中文字体的解决方案
import matplotlib.pyplot as plt import matplotlib as mpl '''mpl.rcParams['font.sans-serif'] = ['FangSong'] 设置中文字体的方法mac不适用,windows应该可以''' font = mpl.font_manager.FontProperties(fname='/System/Library/Fonts/STHeiti Light.ttc') # 不设置中文字体会显示成方块,图表显示的中文必须为u
用户9127725
2022/08/08
6410
matplotlib中文问题
是matplotlib库中没有中文字体。 那么,咱们安装上也就行了。 1、通过pip安装【anaconda】 pip3 install anaconda 2、加上设置 from matplotlib import pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 Demo示例: from matplo
红目香薰
2022/11/30
3480
matplotlib中文问题
简单NLP分析套路(3)---- 可视化展现初步
构思这个系列的初衷是很明显的,之前我是从图论起家搞起了计算机视觉,后来发现深度学习下的计算机视觉没的搞了,后来正好单位的语料很丰富就尝试了NLP 的一些东西,早期非常痴迷于分词等等的技术,后来发现NLP 里面是有广阔天地的。
流川疯
2022/05/10
4950
简单NLP分析套路(3)---- 可视化展现初步
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
这几天在搞论文图,唉说实话抠图这种东西真能逼死人。坐在电脑前抠上一天越看越丑,最后把自己丑哭了……
短短的路走走停停
2019/11/19
6.3K0
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
论文画图神器!9种统计学图形的matplotlib画法|收藏收藏!
上一讲,我们给大家介绍了matplotlib的快速上手教程,介绍了常用的线性图形与散点图的画法。
小雨coding
2021/07/27
2.8K0
论文画图神器!9种统计学图形的matplotlib画法|收藏收藏!
matplotlib 设置绘图时显示中文
matplotlib绘图时,经常会遇到中文字体显示为方块的问题。网上有很多解决方案,比较普遍的是在代码里增加下面两行。
超哥的杂货铺
2020/07/28
1.2K0
Python数据分析之Matplotlib(2)
自己的状态已经调整过来了,今天恢复更新,之前的赠书活动仍然有效,在文末可以点击传送门,大家积极参与。今天介绍的是三剑客之一Matplotlib折线图的相关。
PM小王
2019/07/02
7390
Python数据分析之Matplotlib(2)
数据可视化第二版-03部分-08章-分布
本系列博客为基于《数据可视化第二版》一书的教学资源博客。本文主要是第8章,分布可视化的案例相关。
IT从业者张某某
2023/10/16
2730
数据可视化第二版-03部分-08章-分布
Python可视化图表生成-Matplotlib
Matplotlib 是Python中类似 MATLAB 的绘图工具,熟悉 MATLAB 也可以很快的上手 Matplotlib
用户9925864
2022/07/27
8150
Python可视化图表生成-Matplotlib
Matplotlib绘图的基础操作
对于初步接触matplotlib绘图库的朋友来说,绘图的字体设置、轴标签设置、图例和标题是令人头疼的问题,本文关于这些方面做出些许探讨,限于笔者能力有限,如有错误,敬请指正。
python数据可视化之路
2023/02/23
1.6K0
Matplotlib绘图的基础操作
相关推荐
Matplotlib绘图中文乱码,完整解决方法总结!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验