详解Matplotlib中文字符显示问题

2023-11-17

1.中文字体显示问题

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

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

中文乱码

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.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参数,这种情况下 也不需要额外 处理负号 问题

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.修改本机字符默认配置字体

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

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.自动区别系统然后选择字体

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.其他

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解Matplotlib中文字符显示问题 的相关文章

  • 为什么应用程序会在 sys.exit 命令之后显示?

    我正在关注这个教程 http zetcode com tutorials pyqt4 firstprograms http zetcode com tutorials pyqt4 firstprograms 在第一个示例中 我不明白为什么应
  • python中的编码检测库[重复]

    这个问题在这里已经有答案了 这在某种程度上与我的问题有关here https stackoverflow com questions 2305997 unicodedecodeerror problem with mechanize 我处理
  • 在 numpy 数组中查找满足条件的大量连续值

    我在 numpy 数组中加载了一些音频数据 我希望通过查找静音部分 即一段时间内音频幅度低于特定阈值的部分 来对数据进行分段 一个非常简单的方法是这样的 values join 1 if abs x lt SILENCE THRESHOLD
  • 通过 Python 与 Windows 控制台应用程序交互

    我在 Windows 上使用 python 2 5 我希望通过 Popen 与控制台进程交互 我目前有一小段代码 p Popen console app exe stdin PIPE stdout PIPE issue command 1
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 将 stdout 重定向到 Python 中的文件? [复制]

    这个问题在这里已经有答案了 如何将 stdout 重定向到 Python 中的任意文件 当长时间运行的 Python 脚本 例如 Web 应用程序 从 ssh 会话内启动并处于后台 并且 ssh 会话关闭时 应用程序将引发 IOError
  • Python:如何重构循环导入

    我有件事可以帮你做engine setState
  • 使用 Pandas 查找自滚动高点以来的周期数

    我在 Pandas 中使用rolling max函数 http pandas pydata org pandas docs stable computation html moving rolling statistics moments
  • 如何通过facebook-sdk python api获取用户帖子?

    我使用 facebook jssdk 授权我的应用程序读取用户个人资料和用户帖子 FB login function response scope user status user likes user photos user videos
  • 如何在Python中正确声明ctype结构+联合?

    我正在制作一个二进制数据解析器 虽然我可以依靠 C 但我想看看是否可以使用 Python 来完成该任务 我对如何实现这一点有一些了解 我当前的实现如下所示 from ctypes import class sHeader Structure
  • 如何创建指向指针数组的 Python ctypes 指针

    我需要学习如何处理char 在下面的 C 方法中通过 Python ctypes 我通过使用调用其他只需要单个指针的方法做得很好create string buffer 但此方法需要一个指向指针数组的指针 ladybugConvertToM
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • tweepy 流到 sqlite 数据库 - 语法错误[重复]

    这个问题在这里已经有答案了 可能的重复 tweepy 流到 sqlite 数据库 语法无效 https stackoverflow com questions 9434205 tweepy stream to sqlite database
  • 带有整数的 np.sqrt 和 where 条件返回错误结果

    当我将 numpy sqrt 方法应用于带有 a 的整数数组时 我得到了奇怪的结果where健康 状况 见下文 对于整数 a np array 1 4 9 np sqrt a where a gt 5 Out 3 array 0 0 5 3
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 如何指定一个变量作为类或类实例的成员变量?

    在最新的 Python 2 7 x 中 给定类定义内的任何成员变量 该成员变量是否始终处于类级别 因为它是由该类的所有实例共享的单个变量 在类的定义中 如何指定 类定义中的哪些成员变量属于该类 因此由该类的所有实例共享 以及 哪些属于该类的
  • 提供节点名或服务名,或未知

    我收到这个 Python 错误 File Library Frameworks Python framework Versions 2 7 lib python2 7 urllib2 py line 1184 in do open rais
  • Python 中的 C 指针算术

    我正在尝试将一个简单的 C 程序转换为 Python 但由于我对 C 和 Python 都一无所知 这对我来说很困难 我被 C 指针困住了 有一个函数采用 unsigned long int 指针并将其值添加到 while 循环中的某些变量
  • 在 pip 中为 Flask 应用程序构建 docker 映像失败

    from alpine latest RUN apk add no cache python3 dev pip3 install upgrade pip WORKDIR backend COPY backend RUN pip no cac

随机推荐

  • 剑指offer 06 从尾到头打印链表

    题目 从尾到头打印链表 输入一个链表的头节点 从尾到头反过来返回每个节点的值 用数组返回 示例 输入 head 1 3 2 输出 2 3 1 题解一 栈 解法 遍历链表 将所有遍历到的值压入栈中 再利用栈 后进先出 的特性 从尾到头打印链表
  • STM32 进阶教程 1 - micropython 移植

    前言 Python是一种解释型 面向对象 动态数据类型的高级程序设计语言 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 具有如下特点 1 易于学习 Python有相对较少的关键字 结构简单 和一个明确定义的语
  • ChatGPT Prompting开发实战(五)

    一 如何编写有效的prompt 对于大语言模型来说 编写出有效的prompt能够帮助模型更好地理解用户的意图 intents 生成针对用户提问来说是有效的答案 避免用户与模型之间来来回回对话多次但是用户不能从LLM那里得到有意义的反馈 本文
  • outbound和inbound关系

    Inbound PCI域訪问存储器域 Outbound 存储器域訪问PCI域 RC訪问EP RC存储器域 gt outbound gt RC PCI域 gt EP PCI域 gt inbound gt EP存储器域 EP訪问RC EP存储器
  • python实现主成分估计

    什么是PCA 主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异 将我们手中许多相关性很高的变量转化成彼此相互独立或不相关的变量 通常是选出比原始变量个数少 能解释大部分资料中的变异的几个新变量 即所谓主成分 并用以解释资料
  • python编程基础知识

    python 切片 可以对list对象 如 1 2 3 4 字符串对象 1234 进行切片 使用 str l r str截取索引范围为 l r 索引值可以为负 表示从倒数方向 如 1表示倒数第一项 例 str 123456 str 0 2
  • 微信小程序开发之数据存储 参数传递 数据缓存

    微信小程序开发内测一个月 数据传递的方式很少 经常遇到页面销毁后回传参数的问题 小程序中并没有类似Android的startActivityForResult的方法 也没有类似广播这样的通讯方式 更没有类似eventbus的轮子可用 现在已
  • sql_labs18

    刚拿到题目时一点头绪没有 虽然提示是user agent注入 但没登录之前是看不到有关信息的 之后经过查看知道了两个admin就可以登录上 并且可以查看到user agent信息 判断闭合符 在User Agent字段结束添加单引号 触发报
  • esp32开发板学习

    1 esp32简介 esp32说到底就是一个小型的linux 可以执行我们的代码 尺寸只有一个苹果watch se的大小 可以集成各个物理组件 好像是通过开发板上的引脚来操作的 2 开发板部署python环境 2 1 在pdd花10块钱买了
  • 关闭文件指针不对

    浏览代码时看到下面几行代码 大家看看有啥问题 其中隐含的问题是关闭空的文件指针 所以写了一个测试代码 运行一下 挂了
  • C++模板类重载"<<"未定义错误

    在使用C 的模板类进行编程的时候 重载 lt lt 运算符时 如果定义不当 会出现未定义的情况 错误为LNK2019 这个问题的原因是由于C 的模板编译机制造成的 解决问题的方式是在类中声明 lt lt 运算符时 需要在运算符和参数之间的位
  • 【Python-利用动态二维码传输文件(五)】动态二维码文件发送端开发,使用Tkinter filedialog实现任意格式文件选中,并显示发送状态

    之前四篇文章论证了利用二维码传输文件的可行性 本章使用tkinter开发 动态二维码文件发送端 发送端具备文件选择 开始发送文件 停止发送文件以及显示发送状态的功能 程序界面下 这里下载源码运行 使用tkinter开发动态二维码文件发送端
  • 【JVM】JVM 垃圾收集器与内存分配策略

    JVM 垃圾收集器与内存分配策略 由JVM内存区域可知Java运行时内存的各个区域 其中程序计数器 虚拟机栈 本地方法栈3个区域随线程而生 随线程而灭 当方法结束或者线程结束时 内存就会跟着被回收了 而只有处于运行期间 我们才能知道程序究竟
  • 在IMX8MM平台linux下开发rm67191屏驱动

    NXP IMX8M MINI rel imx 4 14 98 2 0 0 ga 屏芯片 rm67191 屏调试记录 1 不能挂设备 设备树删除ADV7535屏的配置adv bridge 不通编译通过 结果按 https community
  • 一起来看看一个体系完善的前端React组件库是如何搭建出来的!

    作者简介 剑桥 携程资深前端开发工程师 关注自动化工具开发 前端工程自动构建相关技术 随着前端工程的发展 组件化的思想早已深入人心 现代的前端框架React Vue等 都是围绕组件设计 组件化的开发模式 大大提高了开发效率 设计和开发高质量
  • 增长率用计算机怎么算,操作方法:Excel使用公式来计算增长率教程

    有关使用公式计算增长率的Excel教程 Excel经常需要使用公式来计算增长率 如何使用公式来计算增长率 以下是有关使用公式计算增长率的excel教程 希望阅读后能为您带来启发 Excel使用公式来计算增长率教程 计算增长率步骤1 在单元格
  • A Survey on Large Language Models for Recommendation

    本文是LLM系列的文章 针对 A Survey on Large Language Models for Recommendation 的翻译 大模型用于推荐的综述 摘要 1 引言 2 建模范式和分类 3 判别式LLM用于推荐 4 生成式L
  • 关于使用Mybatis时实体类字段切记要使用包装类型

    每周的博客从5月份有开始断更了 看来坚持每周写一篇博客缺失很难 不过从这周开始 除了一方面把之前的那几周没写的博客补回来 另一方面从这周开始要真正逼自己的写一篇博客 并争取在7月份前搭建起自己的个人博客网站 好 废话少说 接下来快速进入今天
  • 线性表的顺序表示--王道2024DS习题代码

    2024年王道数据结构考研复习指导第二章 线性表的顺序表示 课后综合应用题个人学习的相关运行代码 include
  • 详解Matplotlib中文字符显示问题

    文章目录 1 中文字体显示问题 2 几种解决方案 2 1 在绘图代码中设置全局字体 2 2 在绘图代码中设置局部字体 2 3 修改本机字符默认配置字体 2 4 自动区别系统然后选择字体 3 其他 3 1 platform模块 3 2 常见中