使用matplotlib绘图中文字符显示问题:UserWarning: missing from current font.

本文介绍了使用Matplotlib绘图时遇到的中文显示问题及解决方案,包括设置全局和局部字体的方法,以及修改本地配置文件来支持中文显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、中文字体显示问题:

2、几种解决方案

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

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

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


1、中文字体显示问题:

C:\Users\86157\anaconda3\lib\site-packages\IPython\core\pylabtools.py:132: UserWarning: Glyph 26376 (\N{CJK UNIFIED IDEOGRAPH-6708}) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)

在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式,具体见下方案例:
# 设置线宽
plt.figure(figsize=(10,4))
plt.plot(x, y, linewidth=4)
# 设置图表标题,并给坐标轴添加标签
plt.title("月份/成交额折线图", fontsize=12)
plt.xlabel("月份", fontsize=12)
plt.ylabel("成交额", 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()
 

中文乱码: 

C:\Users\86157\anaconda3\lib\site-packages\IPython\core\pylabtools.py:132: UserWarning: Glyph 26376 (\N{CJK UNIFIED IDEOGRAPH-6708}) missing from current font.
  fig.canvas.print_figure(bytes_io, **kw)

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

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

2、几种解决方案

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

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

Python脚本中动态设置matplotlibrc,这样也可以避免由于更改配置文件而造成的麻烦,具体代码如下:

from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]

有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,此时需要更改axes.unicode_minus参数:

# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

注意: 

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

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

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

  • 步骤一:下载 SimHei字体(或者其他的支持中文显示的字体也行)
  • 步骤二:安装字体
  • windows和mac下:双击安装
  • 步骤三:修改配置文件matplotlibrc 查找配置文件路径:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib

print(matplotlib.matplotlib_fname())  # 此处输出的就是配置文件的路径

打开文件查看:

将文件内容修改为:

font.family: sans-serif
font.sans-serif: SimHei
axes.unicode_minus: False

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

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

 修改True为False

<think>嗯,用户遇到了在Python使用Seaborn绘图时出现字体缺失的警告,具体是CJK UNIFIED IDEOGRAPH相关的字符无法显示。我需要根据他们提供的引用资料和系统指令来给出解决方案。首先,我应该回忆一下常见的字体问题处理步骤。通常,这类警告是因为Matplotlib找不到合适的中文字体,所以默认字体不支持这些字符。 根据用户提供的引用[1]和[2],问题出在Matplotlib的后端无法找到对应的中文字符,导致运行时警告。解决方法通常涉及设置正确的字体路径或指定支持中文的字体。比如,用户可能需要手动指定系统里已有的中文字体,比如SimHei或者微软雅黑。此外,引用[4]提到了修改可视化部分的代码,可能涉及到调整绘图参数或字体设置。 接下来,我需要一步步梳理解决方案。首先,检查系统是否安装了中文字体,比如在Windows系统中,通常会有SimHei、Microsoft YaHei等。然后,在Python代码中配置Matplotlib的默认字体。可能需要使用rcParams来设置字体族(font.family)和具体字体名称(font.sans-serif)。同时,确保在绘图前加载这些设置,避免被其他设置覆盖。 用户可能还需要清除Matplotlib的缓存,因为有时候旧的缓存会导致字体加载不正确。另外,如果用户使用Seaborn,可能需要额外设置Seaborn的字体,因为Seaborn基于Matplotlib,但可能有自己的默认设置。此外,引用[3]提到了模型转换的问题,可能不相关,但需要确认用户是否有其他环境问题,比如虚拟环境中的字体路径是否正确。 还有,用户提到的引用[4]关于修改YOLOv5的plots.py文件,这可能说明用户在使用某些特定库时也需要调整字体设置。不过对于Seaborn来说,主要还是Matplotlib的配置。所以解决方案应包括设置字体、清除缓存、指定具体字体文件路径(如果需要),以及可能的代码调整。 需要注意的是,用户可能在不同的操作系统环境下,比如Win10,所以需要给出针对Windows的路径示例,比如字体文件可能位于C:/Windows/Fonts/目录下。另外,使用绝对路径来指定字体文件可能更可靠,避免相对路径的问题。此外,还要提醒用户可能需要重新启动Python内核或重新运行脚本以使设置生效。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如其他绘图库的字体设置、动态生成图片的字体问题,以及如何确认字体是否成功加载等。确保用户能够全面理解和解决类似的问题。</think>### 解决Python中Seaborn绘图字体缺失警告的步骤 #### 1. **确认字体缺失的根本原因** - 警告如 `Glyph 24180 missing from current font` 表明当前Matplotlib默认字体不支持CJK字符(如中文、日文、韩文)。 - Seaborn基于Matplotlib,因此需通过调整Matplotlib的字体配置解决[^1][^2]。 --- #### 2. **手动指定中文字体** **方法一:全局设置Matplotlib字体** 在代码开头添加以下配置(以Windows系统为例): ```python import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定黑体(SimHei)为默认字体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示异常 ``` *注*:`SimHei` 是Windows自带的中文字体,其他系统需替换为支持的字体(如 `Microsoft YaHei`、`WenQuanYi Zen Hei`)。 **方法二:指定字体文件路径** 若系统未正确识别字体,可手动加载字体文件: ```python from matplotlib.font_manager import FontProperties font = FontProperties(fname='C:/Windows/Fonts/simhei.ttf') # 替换为实际路径 sns.set(font=font.get_name()) # 应用到Seaborn ``` --- #### 3. **清除Matplotlib缓存** - Matplotlib缓存可能导致字体配置未生效,删除缓存目录: - Windows路径:`C:\Users\<用户名>\.matplotlib` - 执行以下代码强制刷新配置: ```python import matplotlib matplotlib.font_manager._rebuild() ``` --- #### 4. **修改Seaborn绘图代码** 在绘图时显式指定字体: ```python import seaborn as sns sns.set_style("whitegrid", {'font.sans-serif': ['SimHei']}) # 设置Seaborn样式及字体 ``` --- #### 5. **验证字体是否生效** 运行以下代码测试中文字体显示: ```python import matplotlib.pyplot as plt plt.plot([1, 2, 3], label='测试中文') plt.legend() plt.show() ``` *预期结果*:图例应正常显示“测试中文”且无警告。 --- #### 6. **特殊场景处理** - **动态生成图像(如Web应用)**:需确保服务器环境已安装中文字体。 - **导出为PDF/矢量图**:使用支持中文的LaTeX引擎或嵌入字体: ```python plt.rcParams['pdf.fonttype'] = 42 # 嵌入TrueType字体 ``` --- ###
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Siobhan.Mxin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值