1. 问题缘起:一个看似简单却困扰无数人的“小麻烦”
如果你用Python的matplotlib画过图,并且尝试过在图上添加中文标签、标题或者图例,那你大概率遇到过那个经典的“豆腐块”问题——本该显示“销售额”的地方,变成了一堆谁也看不懂的方框或者乱码。这几乎是每个数据分析师、科研工作者或者Python可视化入门者都会踩的第一个“大坑”。我刚开始用matplotlib做报告图表时,也被这个问题折腾得够呛,明明代码逻辑都对,数据也漂亮,最后生成的图却因为几个中文乱码显得极不专业。
这个问题之所以“经典”,是因为它的根源不在我们的代码逻辑,而在系统环境。matplotlib作为一个跨平台的库,默认使用的字体并不包含完整的中文字符集。在Windows、macOS或者各种Linux发行版(如CentOS、Ubuntu)上,由于字体查找路径和默认配置的差异,解决方式也略有不同。网上教程很多,但往往只针对单一系统,或者步骤不全,导致你在自己的环境里照搬时依然失败。今天,我就结合自己多年在Windows服务器、个人开发机以及CentOS生产环境上的实战经验,把这个问题彻底讲透,提供一个覆盖主流系统的“一站式”解决方案。
2. 乱码的本质:字体与字符编码的错配
在深入操作之前,我们必须先搞清楚乱码是怎么产生的。这不是matplotlib的bug,而是一个字体配置问题。
简单来说,当matplotlib要在图片上渲染一段文本(比如
plt.xlabel(‘月份’)
)时,它需要做两件事:
- 解码 :将你代码里写的字符串(在Python 3中默认是Unicode),根据一定的编码方式转换成内部可以处理的字符。
- 渲染 :根据选定的字体文件,找到每个字符对应的图形(glyph),然后画到图上。
乱码就发生在这两个环节的衔接上。matplotlib有一个默认的字体配置文件,它指定了渲染时优先使用哪些字体。这些默认字体(如
DejaVu Sans
)通常是英文字体,不包含中文字形。当它遇到一个中文字符时,如果在当前字体里找不到对应的图形,它可能会回退到其他字体,如果回退链中所有字体都没有这个字,它就会用一个“缺失字符”的占位符(通常是小方框
□
)或者显示为乱码来替代。
所以,解决思路非常清晰: 告诉matplotlib,在渲染文本时,使用一个包含了完整中文字符集的字体 。这通常意味着我们需要:
-
在操作系统中找到一个可用的中文字体文件(如
SimHei黑体、Microsoft YaHei微软雅黑、SimSun宋体等)。 - 将这个字体文件的路径明确配置给matplotlib。
- 在代码中指定使用这个中文字体。
接下来,我们就分系统来详细操作。
3. Windows系统下的解决方案(永久生效)
Windows系统通常自带了不少中文字体,这是我们解决问题的资源库。我们的目标不是每次画图时临时设置,而是一劳永逸地修改matplotlib的默认配置,让之后的所有绘图都自动使用中文字体。
3.1 定位中文字体文件
首先,找到你系统里可用的中文字体。它们通常位于
C:\Windows\Fonts\
目录下。你可以直接打开这个文件夹,找到你想要的中文字体,比如“微软雅黑”(对应文件名通常是
msyh.ttc
或
msyhbd.ttc
)或“黑体”(
simhei.ttf
)。
更可靠的方法是通过Python来获取字体的完整路径:
import matplotlib.font_manager as fm
# 获取系统中所有字体信息
font_list = fm.findSystemFonts(fontpaths=None, fontext='ttf') + fm.findSystemFonts(fontpaths=None, fontext='ttc')
# 过滤出包含中文名称的字体
chinese_fonts = []
for font_path in font_list:
try:
prop = fm.FontProperties(fname=font_path)
font_name = prop.get_name()
# 简单判断:字体名是否包含常见中文字符或已知中文字体名
if 'YaHei' in font_name or 'Hei' in font_name or 'Song' in font_name or 'Kai' in font_name:
chinese_fonts.append((font_name, font_path))
except:
pass
for name, path in chinese_fonts[:5]: # 打印前5个看看
print(f"字体名: {name}, 路径: {path}")
运行这段代码,你可能会看到类似这样的输出:
字体名: Microsoft YaHei, 路径: C:\WINDOWS\Fonts\msyh.ttc
字体名: Microsoft YaHei UI, 路径: C:\WINDOWS\Fonts\msyhl.ttc
字体名: SimHei, 路径: C:\WINDOWS\Fonts\simhei.ttf
记下你选中的字体路径,例如
C:\WINDOWS\Fonts\simhei.ttf
。
3.2 修改matplotlib的默认配置文件(推荐)
这是最彻底的方法。matplotlib在启动时会读取一个名为
matplotlibrc
的配置文件。我们可以修改用户级的配置文件。
第一步:找到配置文件位置。
import matplotlib
print(matplotlib.matplotlib_fname())
这会打印出当前生效的
matplotlibrc
文件的路径。通常,我们修改用户目录下的那个,路径类似于
C:\Users\你的用户名\.matplotlib\matplotlibrc
。如果这个文件不存在,你可以从matplotlib的安装目录里复制一个模板过来,或者直接新建。
第二步:编辑配置文件。
用记事本或任何文本编辑器打开这个
matplotlibrc
文件,找到以下两行(可能被注释掉,以
#
开头):
#font.family : sans-serif
#font.sans-serif : DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
你需要做两处修改:
-
取消
font.family的注释,并确保其值为sans-serif(无衬线字体族,黑体、雅黑都属于这一类)或serif(衬线字体族,宋体属于这一类)。根据你选的字体来定,选黑体就用sans-serif。 -
在
font.sans-serif(或font.serif)列表的 最前面 ,添加你选中文字体的 字体名称 (不是文件名!)。如何获取字体名称?用上面Python代码里的prop.get_name(),或者直接写SimHei、Microsoft YaHei。
修改后的配置片段示例(假设使用黑体
SimHei
):
font.family : sans-serif
font.sans-serif : SimHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
第三步:清除字体缓存。
matplotlib会缓存字体列表以加速加载。修改配置后,必须删除缓存文件让它重新生成。
缓存文件通常位于:
C:\Users\你的用户名\.matplotlib\fontlist-vXXX.json
(XXX是版本号)。直接删除这个json文件即可。你也可以通过代码强制清除:
import matplotlib
matplotlib.font_manager._rebuild()
完成以上三步后, 重启你的Python解释器或IDE(如VSCode、PyCharm) 。之后,你无需在代码中做任何特殊设置,matplotlib默认就会使用中文字体了。
import matplotlib.pyplot as plt
import numpy as np
plt.plot([1, 2, 3], [4, 5, 1])
plt.title('这是一个中文标题')
plt.xlabel('横轴标签')
plt.ylabel('纵轴标签')
plt.show()
3.3 注意事项与常见坑点
-
字体名称 vs 字体文件名
:这是最容易出错的地方。在
matplotlibrc里配置的是font.sans-serif: SimHei,这个SimHei是字体的“全名”(Full Name),而不是文件名simhei.ttf。一定要用上面Python代码查出来的font_name。 -
缓存问题
:修改配置后不生效,十有八九是缓存没清理。务必删除那个
fontlist-vXXX.json文件并重启内核。 -
权重设置
:如果你的中文字体在显示时特别细或特别粗,可能需要额外配置字重(weight)。可以在
matplotlibrc中设置font.weight: normal(或bold),或者在代码中使用fontdict参数精细控制。 -
VSCode等编辑器内预览问题
:在VSCode的Jupyter Notebook或Python交互窗口里,如果图形显示依然乱码,可能是编辑器内置的图形渲染后端问题。尝试将matplotlib的后端设置为
TkAgg或Qt5Agg,这通常能获得更好的系统字体支持。import matplotlib matplotlib.use('TkAgg') # 放在import pyplot之前 import matplotlib.pyplot as plt
4. Linux/macOS系统下的解决方案(以CentOS为例)
Linux系统(如CentOS、Ubuntu)通常不自带Windows那样的中文字体,所以我们需要手动安装。macOS系统自带多种语言字体,但matplotlib可能没有正确索引到,解决方法类似。
4.1 为系统安装中文字体
我们以在CentOS 7/8上安装“文泉驿微米黑”或“思源黑体”为例,它们都是开源且质量不错的中文字体。
方法一:使用yum安装字体包(最简单)
对于CentOS/RHEL系列,可以尝试安装
wqy-microhei-fonts
包。
sudo yum install wqy-microhei-fonts -y
安装后,字体文件通常会出现在
/usr/share/fonts/wqy-microhei/
目录下。
方法二:手动下载并安装字体文件(通用) 如果仓库里没有,或者你想用其他字体(如思源黑体),可以手动操作。
-
下载字体文件(以思源黑体为例,可从GitHub release页面下载):
wget -O source-han-sans.zip https://github.com/adobe-fonts/source-han-sans/releases/download/2.004R/SourceHanSansSC.zip -
解压并复制到系统字体目录:
unzip source-han-sans.zip -d source-han-sans sudo mkdir -p /usr/share/fonts/custom sudo cp source-han-sans/OTF/SimplifiedChinese/*.otf /usr/share/fonts/custom/ -
更新系统字体缓存:
sudo fc-cache -fv -
验证字体是否安装成功:
如果看到fc-list :lang=zhSource Han Sans SC等字样,说明安装成功。
4.2 配置matplotlib使用新字体
字体安装到系统后,matplotlib不一定立刻就能找到。我们需要像在Windows上一样,告诉matplotlib这个新字体的存在和路径。
第一步:在代码中动态指定字体路径(临时方法) 这种方法每次运行脚本时都需要执行,适合单次任务或脚本。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
# 指定你的中文字体文件路径
font_path = '/usr/share/fonts/custom/SourceHanSansSC-Regular.otf' # 根据实际路径修改
# 将字体属性添加到matplotlib的字体管理器
fm.fontManager.addfont(font_path)
font_prop = fm.FontProperties(fname=font_path)
font_name = font_prop.get_name()
# 设置matplotlib的默认字体
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = [font_name] # 使用字体名
# 同时设置Unicode负号显示正常
plt.rcParams['axes.unicode_minus'] = False
# 现在可以正常画图了
plt.plot([1,2,3], [4,5,1])
plt.title('中文标题 - CentOS测试')
plt.show()
第二步:修改matplotlib配置文件(永久生效,推荐) 原理同Windows。首先找到配置文件位置:
import matplotlib
print(matplotlib.matplotlib_fname())
在Linux上,路径可能是
/home/你的用户名/.config/matplotlib/matplotlibrc
或
/home/你的用户名/.matplotlib/matplotlibrc
。
编辑这个文件,同样修改
font.family
和
font.sans-serif
(或
font.serif
)配置项。关键是要确保你列出的字体名,是系统
fc-list
能识别出来的,并且它在
font.sans-serif
列表的前列。
例如,使用思源黑体:
font.family : sans-serif
font.sans-serif : Source Han Sans SC, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
axes.unicode_minus : False
同样,修改配置后,需要
删除字体缓存文件
(位于
~/.cache/matplotlib/
或
~/.matplotlib/
下,如
fontlist-vXXX.json
)并重启Python环境。
4.3 Docker环境中的特殊处理
在Docker容器里运行Python绘图脚本时,容器内很可能是一个极简的Linux环境,没有任何中文字体。你需要将字体安装步骤写入Dockerfile。
一个典型的Dockerfile片段示例如下:
FROM python:3.9-slim
# 安装系统依赖和字体
RUN apt-get update && apt-get install -y \
wget \
unzip \
fontconfig \
--no-install-recommends && \
rm -rf /var/lib/apt/lists/*
# 下载并安装思源黑体
RUN wget -O /tmp/source-han-sans.zip https://github.com/adobe-fonts/source-han-sans/releases/download/2.004R/SourceHanSansSC.zip && \
unzip /tmp/source-han-sans.zip -d /tmp/source-han-sans && \
mkdir -p /usr/share/fonts/custom && \
cp /tmp/source-han-sans/OTF/SimplifiedChinese/*.otf /usr/share/fonts/custom/ && \
fc-cache -fv && \
rm -rf /tmp/source-han-sans.zip /tmp/source-han-sans
# 安装Python依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt # requirements.txt中包含matplotlib
COPY . .
CMD ["python", "your_script.py"]
这样构建的镜像就包含了中文字体,你的matplotlib代码在容器内也能正常显示中文了。
5. 跨平台兼容的代码级方案
有时我们写的脚本需要在不同同事的电脑、不同的服务器(Windows/Linux/macOS)上运行,我们不可能去修改每个人的系统配置。这时,一个健壮的、代码级的解决方案就非常必要。其核心思想是: 在代码运行时自动探测操作系统,并加载对应的中文字体文件 。
5.1 自动探测系统并加载字体
我们可以写一个工具函数,放在脚本的开头,一劳永逸。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import platform
import os
def set_chinese_font():
"""
根据操作系统自动设置matplotlib中文字体。
请确保相应字体文件存在于指定路径或系统中。
"""
system = platform.system()
font_path = None
if system == 'Windows':
# Windows: 尝试几个常见的中文字体路径
possible_fonts = [
'C:/Windows/Fonts/simhei.ttf', # 黑体
'C:/Windows/Fonts/msyh.ttc', # 微软雅黑
'C:/Windows/Fonts/simsun.ttc', # 宋体
]
for fp in possible_fonts:
if os.path.exists(fp):
font_path = fp
print(f"找到字体文件: {font_path}")
break
elif system == 'Linux':
# Linux: 尝试常见安装路径
possible_fonts = [
'/usr/share/fonts/wqy-microhei/wqy-microhei.ttc', # 文泉驿微米黑
'/usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc', # Noto字体
'/usr/share/fonts/custom/SourceHanSansSC-Regular.otf', # 思源黑体
]
# 也可以尝试用fc-match查找
for fp in possible_fonts:
if os.path.exists(fp):
font_path = fp
print(f"找到字体文件: {font_path}")
break
elif system == 'Darwin': # macOS
# macOS: 系统字体通常在/Library/Fonts/或~/Library/Fonts/
possible_fonts = [
'/Library/Fonts/Arial Unicode.ttf', # Arial Unicode MS,包含中文但可能不全
'/System/Library/Fonts/PingFang.ttc', # 苹方,macOS自带
'/Library/Fonts/Microsoft/SimHei.ttf', # 如果安装了Office
]
for fp in possible_fonts:
if os.path.exists(fp):
font_path = fp
print(f"找到字体文件: {font_path}")
break
if font_path and os.path.exists(font_path):
# 添加字体到管理器并设置
fm.fontManager.addfont(font_path)
font_prop = fm.FontProperties(fname=font_path)
font_name = font_prop.get_name()
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = [font_name]
plt.rcParams['axes.unicode_minus'] = False
print(f"已设置中文字体为: {font_name}")
else:
print("警告:未找到合适的中文字体文件,中文可能显示为乱码。")
# 可以在这里提供一个备选方案,例如使用支持Web字体的方式(后文会讲)
# 在脚本最开头调用这个函数
set_chinese_font()
# 之后正常绘图
plt.plot([1,2,3], [4,5,1])
plt.title('跨平台中文测试')
plt.show()
5.2 使用相对路径打包字体(适用于项目分发)
对于需要分发给别人的项目,你可以将字体文件(确保字体许可证允许分发)放在项目目录里,比如
./fonts/
下。然后在代码中直接使用相对路径加载,这样就完全摆脱了对系统环境的依赖。
项目结构:
my_project/
├── fonts/
│ └── SourceHanSansSC-Regular.otf
├── utils/
│ └── font_setup.py
└── main_plot.py
在
font_setup.py
中:
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import os
def set_project_font(font_relative_path='./fonts/SourceHanSansSC-Regular.otf'):
"""
使用项目内自带的字体文件。
:param font_relative_path: 字体文件相对于此脚本或项目根目录的路径。
"""
# 获取当前文件所在目录,然后构建字体绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 假设字体文件在utils目录的同级fonts目录下
font_abs_path = os.path.join(os.path.dirname(current_dir), font_relative_path)
if os.path.exists(font_abs_path):
fm.fontManager.addfont(font_abs_path)
font_prop = fm.FontProperties(fname=font_abs_path)
font_name = font_prop.get_name()
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = [font_name]
plt.rcParams['axes.unicode_minus'] = False
print(f"已从项目路径加载字体: {font_name}")
return True
else:
print(f"错误:在路径 {font_abs_path} 未找到字体文件。")
return False
在
main_plot.py
中:
import sys
import os
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
from utils.font_setup import set_project_font
set_project_font()
import matplotlib.pyplot as plt
# ... 你的绘图代码
这种方法最可靠,确保了在任何能运行Python的环境里,只要项目文件齐全,中文显示就不会有问题。
6. 进阶技巧与疑难杂症排查
即使按照上述步骤操作,有时还是会遇到一些奇怪的问题。这里分享几个我踩过的坑和对应的解决办法。
6.1 字体缓存导致的“配置生效延迟”
这是最常见的问题。你明明修改了
matplotlibrc
或者用
rcParams
设置了字体,运行代码却还是乱码。
根本原因
:matplotlib在第一次导入时,会扫描字体目录并生成一个缓存文件(
fontlist-vXXX.json
)。后续导入会直接读取这个缓存,以提高速度。如果你在生成缓存之后才安装新字体或修改配置,matplotlib就“看不见”这些变化。
解决方案 :
-
定位并删除缓存文件
:
这会打印出缓存目录,进去找到import matplotlib as mpl print(mpl.get_cachedir())fontlist-vXXX.json并删除它。 -
在代码中强制重载
(不总是有效,但可以尝试):
import matplotlib.font_manager matplotlib.font_manager._rebuild() - 最彻底的方法 :在修改字体配置或安装新字体后, 重启Python内核/解释器 。在Jupyter Notebook中,点击“Kernel -> Restart”;在VSCode等IDE中,重新运行整个脚本或重启终端。
6.2 特定图形元素乱码(如刻度标签、图例)
有时候,标题和轴标签正常了,但刻度标签或者图例里的中文还是乱码。这通常是因为这些元素有自己独立的字体属性设置。
例如,设置刻度字体 :
plt.rcParams['font.family'] = 'SimHei' # 设置全局字体
# 但如果你用LaTeX渲染数学公式,刻度可能会用数学字体,需要单独设置
plt.rcParams['mathtext.fontset'] = 'stix' # 或者 'cm', 'dejavusans' 等,确保其支持中文或关闭数学字体模式
plt.rcParams['axes.unicode_minus'] = False
# 更精细的控制:直接获取当前坐标轴,设置其刻度字体
ax = plt.gca()
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontproperties(fm.FontProperties(fname='your_font.ttf'))
图例乱码
:
如果图例文本是通过
label
参数传递的字符串,它会继承全局字体设置。但如果你手动用
plt.legend([‘系列1’, ‘系列2’])
这样的列表创建图例,需要确保列表里的字符串是Unicode,并且图例对象本身没有覆盖字体设置。
6.3 使用Web字体或在线资源作为后备方案
在一些极端受限的环境(如某些无法安装字体的服务器、在线Notebook环境),我们可以考虑使用matplotlib支持的网络字体(从URL加载)。但这需要网络连接,并且字体文件可能较大。
matplotlib的
font_manager
模块支持从URL添加字体。你可以将一个中文字体文件(如思源黑体)托管在可公开访问的URL上,或者使用一些已知的CDN。
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import urllib.request
import tempfile
import os
def load_font_from_url(font_url):
"""从URL下载并加载字体"""
try:
# 下载字体到临时文件
with tempfile.NamedTemporaryFile(delete=False, suffix='.ttf') as tmp_file:
urllib.request.urlretrieve(font_url, tmp_file.name)
font_path = tmp_file.name
# 添加到字体管理器
fm.fontManager.addfont(font_path)
font_prop = fm.FontProperties(fname=font_path)
return font_prop.get_name()
except Exception as e:
print(f"从URL加载字体失败: {e}")
return None
# 示例:使用一个假设的字体URL(实际使用时请替换为有效且可商用的字体URL)
font_url = "https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf"
font_name = load_font_from_url(font_url)
if font_name:
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = [font_name]
print(f"已加载网络字体: {font_name}")
else:
print("使用网络字体失败,尝试其他方案或使用默认字体(可能乱码)。")
注意 :此方法涉及从网络下载文件,需要考虑网络稳定性、字体文件的版权许可以及安全性(确保URL可信)。在生产环境中,更推荐将字体文件打包进项目。
6.4 生成图片文件(如PNG、PDF)时的字体嵌入
当你用
plt.savefig(‘figure.png’, dpi=300)
保存图片时,字体信息是需要被“嵌入”到图片文件中的。如果保存后的图片在别的电脑上打开中文变乱码,那可能是字体嵌入出了问题。
对于矢量格式(如PDF、SVG),字体嵌入尤其重要。matplotlib的PDF后端默认会嵌入字体。你可以通过以下方式检查或控制:
# 保存为PDF,检查是否嵌入字体
plt.savefig('output.pdf', format='pdf', bbox_inches='tight')
# 对于保存图片,确保在保存前已经正确设置了中文字体。
# 有时在GUI窗口显示正常,保存却不正常,可能是因为保存时使用了不同的后端或配置。
# 一个稳妥的做法是,在非交互式脚本中,在导入pyplot后立即设置字体,然后再绘图和保存。
import matplotlib
matplotlib.use('Agg') # 使用不依赖GUI的后端,常用于服务器生成图片
import matplotlib.pyplot as plt
# ... 设置字体
# ... 绘图
plt.savefig('output.png')
plt.close() # 记得关闭图形,特别是在循环中生成多张图时
使用
‘Agg’
后端是一个好习惯,它纯粹用于生成图片文件,不尝试打开任何显示窗口,在Linux服务器或无图形界面的环境中尤其稳定。
7. 总结与最佳实践建议
折腾了这么多,我们来梳理一下在不同场景下的最佳选择,让你能快速决策:
-
个人开发环境(Windows/macOS) :
-
首选
:修改用户目录下的
matplotlibrc配置文件,一劳永逸。记得清理字体缓存并重启Python环境。 -
备选
:在代码开头使用
plt.rcParams动态设置。可以封装成函数,方便多个脚本复用。
-
首选
:修改用户目录下的
-
Linux服务器环境(CentOS/Ubuntu等) :
-
第一步
:通过系统包管理器(
yum,apt)或手动安装一款开源中文字体(如wqy-microhei,fonts-noto-cjk)。 -
第二步
:同样通过修改
matplotlibrc或代码设置来使用它。在Dockerfile中,务必包含字体安装步骤。
-
第一步
:通过系统包管理器(
-
需要跨平台运行或分发的项目/脚本 :
-
强推方案
:将字体文件(需确认许可证)放入项目目录(如
./fonts/),在代码中使用相对路径加载。这是最可靠、依赖最少的方式。 -
动态探测方案
:使用
platform模块判断系统,并尝试加载常见路径下的字体文件。记得做好找不到字体时的降级处理(如打印警告、使用英文标签)。
-
强推方案
:将字体文件(需确认许可证)放入项目目录(如
-
在线环境或严格受限环境 :
- 考虑使用支持Web字体的方案,但需权衡网络依赖和版权。
- 如果实在无法解决,最后的退路是:将中文文本先渲染成位图(使用PIL/Pillow库),再作为图片插入到matplotlib图形中。这比较麻烦,但能保证显示。
最后几个小贴士 :
- 测试 :修改字体后,用一个简单的包含中文标题、标签、图例的脚本进行测试。
- 版本 :留意matplotlib的版本差异。一些老版本(如2.x以下)的字体配置方式可能略有不同。
-
负号
:设置中文字体后,别忘了
plt.rcParams[‘axes.unicode_minus’] = False,否则坐标轴负号可能显示异常。 -
备份
:在修改
matplotlibrc前,先备份原文件。
解决matplotlib中文乱码的过程,本质上是一次对字体系统和库配置机制的深入理解。希望这篇超详细的指南,能帮你彻底扫清这个障碍,让你生成的每一张图表都清晰、专业。

685

被折叠的 条评论
为什么被折叠?



