Linux下Matplotlib中文乱码终极解决方案:从字体安装到全局配置(附SimHei.ttf下载)
Linux下Matplotlib中文显示:从乱码到优雅的完整实践指南
如果你在Linux服务器上跑过数据可视化脚本,大概率见过那个让人头疼的方块阵——Matplotlib默认字体对中文的支持几乎为零。这不是个小问题,当你的图表需要呈现给中文用户,或者分析报告里必须包含中文标签时,乱码直接让专业度打对折。
我最初遇到这个问题时,试了网上七八种方法,有的临时生效,换个环境又失效;有的需要root权限,在严格管控的生产服务器上根本行不通。经过多次踩坑和反复测试,终于整理出一套真正可靠、适应不同场景的解决方案。这篇文章不会只给你一个“万能命令”,而是带你理解字体系统的运作机制,掌握从临时调试到永久配置的全套方法。
无论你是个人开发者在本地Ubuntu上折腾,还是运维工程师需要在无网络访问的离线服务器上部署,或是数据科学家在Docker容器里构建可复现的分析环境,这里都有对应的解决路径。
1. 理解Linux字体系统与Matplotlib的字体查找逻辑
要彻底解决中文显示问题,得先知道Matplotlib在Linux上是怎么找字体的。很多人直接复制粘贴配置命令,但一旦环境稍有变化就束手无策,根本原因在于没搞懂背后的机制。
1.1 Matplotlib的字体加载流程
Matplotlib启动时会执行一个复杂的字体发现过程:
- 读取配置文件:首先查找
matplotlibrc文件,确定默认的字体族(如sans-serif、serif等) - 扫描字体目录:根据配置的字体族,在多个预定义路径中搜索可用的字体文件
- 构建字体缓存:将找到的字体信息缓存到
~/.cache/matplotlib/或~/.matplotlib/目录下 - 渲染时匹配:当需要显示文本时,从缓存中匹配最合适的字体
关键点在于,Matplotlib不会自动识别系统安装的所有字体,它有自己的字体路径列表。这个列表通常包括:
# 查看Matplotlib的字体搜索路径 import matplotlib from matplotlib import font_manager print("Matplotlib配置文件位置:", matplotlib.matplotlib_fname()) print("\n字体搜索路径:") for path in font_manager.fontManager.ttflist: # 这里只显示前几个路径示例 if 'ttf' in path.fname: print(path.fname) break在典型的Linux系统中,Matplotlib主要查找以下位置:
/usr/share/fonts/- 系统全局字体目录/usr/local/share/fonts/- 本地安装的字体~/.fonts/- 用户个人字体目录(较新系统可能是~/.local/share/fonts/)- Matplotlib自带的字体目录(通常在Python包的
mpl-data/fonts/ttf/下)
1.2 为什么中文字体会显示为方块?
当Matplotlib找不到匹配的字体时,它会回退到默认字体。Linux下Matplotlib的默认字体通常是DejaVu Sans或Bitstream Vera Sans,这些字体不包含中文字形。遇到中文字符时,系统有两种处理方式:
- 直接显示缺失字形:显示为空白或方块(□)
- 尝试字体回退:如果系统配置了字体回退链,可能会尝试其他字体,但Matplotlib的配置中通常没有正确的中文字体回退设置
注意:即使你在系统中安装了中文字体,如果Matplotlib的字体缓存没有更新,或者配置文件没有正确指向这些字体,中文仍然无法显示。
1.3 字体文件格式:TTF vs TTC
这是很多人忽略但极其重要的细节:
| 字体格式 | 全称 | 特点 | Matplotlib支持 |
|---|---|---|---|
| TTF | TrueType Font | 单个字体文件,包含一种字重和样式 | ✅ 完全支持 |
| TTC | TrueType Collection | 多个TTF字体的集合(如常规、粗体、斜体等打包在一起) | ⚠️ 有限支持 |
大多数Windows字体(如微软雅黑msyh.ttc)都是TTC格式。虽然有些教程说可以直接使用,但我实测在部分Linux发行版和Matplotlib版本中,TTC字体会导致各种奇怪问题。最稳妥的方案是使用TTF格式的中文字体。
如果你只有TTC文件,可以尝试用fonttools工具进行转换:
# 安装fonttools pip install fonttools # 将TTC转换为多个TTF文件 pyftsubset msyh.ttc --text="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" --output-file=msyh-regular.ttf # 更简单的方法:使用在线转换工具或寻找TTF版本的字体2. 中文字体的获取与安装策略
解决了“为什么”,接下来是“怎么做”。第一步是获取合适的中文字体。这里我推荐几个经过实际项目验证的可靠选择。
2.1 字体选择:哪些中文字体最适合数据可视化?
不是所有中文字体都适合在图表中使用。好的数据可视化字体应该具备:
- 清晰易读:在小字号下依然清晰可辨
- 字形完整:包含常用汉字和符号
- 风格中性:不过度装饰,不影响数据本身的呈现
- 授权友好:允许在商业项目中使用
基于这些标准,我推荐以下字体:
| 字体名称 | 文件格式 | 特点 | 适用场景 | 授权情况 |
|---|---|---|---|---|
| 思源黑体 | TTF | 开源免费,字形完整,7种字重 | 所有场景,特别是需要多字重的专业报告 | SIL开源字体授权 |
| 文泉驿微米黑 | TTF | 专为屏幕显示优化,开源免费 | 服务器环境,无GUI的纯命令行场景 | GPL授权 |
| 方正黑体_GBK | TTF | 商业字体,Windows兼容性好 | 需要与Windows文档保持一致的场景 | 需购买商业授权 |
| SimHei(黑体) | TTF | Windows自带,广泛使用 | 临时解决方案,兼容性测试 | 随Windows授权 |
个人建议:对于长期项目,优先选择思源黑体。它不仅免费开源,而且由Adobe和Google共同开发,质量有保障,几乎包含了所有现代汉字。
2.2 字体安装的三种方式及适用场景
根据你的使用环境和权限,选择不同的安装策略:
方式一:用户级安装(推荐用于个人开发环境)
这是最安全、最灵活的方式,不需要root权限,不会影响系统其他用户。
# 创建用户字体目录(如果不存在) mkdir -p ~/.local/share/fonts/ # 下载思源黑体(以Regular字重为例) wget -O ~/.local/share/fonts/SourceHanSansSC-Regular.ttf \ "https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf" # 或者使用curl curl -L -o ~/.local/share/fonts/SourceHanSansSC-Regular.ttf \ "https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf" # 更新用户字体缓存 fc-cache -fv ~/.local/share/fonts/验证安装是否成功:
# 查看已安装的中文字体 fc-list :lang=zh | grep -i "source\|思源" # 应该能看到类似输出: # /home/username/.local/share/fonts/SourceHanSansSC-Regular.ttf: Source Han Sans SC,思源黑体:style=Regular方式二:系统级安装(适用于多用户环境或Docker基础镜像)
如果你有sudo权限,并且希望所有用户都能使用这些字体:
# 创建系统字体目录 sudo mkdir -p /usr/share/fonts/chinese/ # 复制字体文件(假设字体文件已下载到当前目录) sudo cp SourceHanSansSC-*.ttf /usr/share/fonts/chinese/ # 修改权限 sudo chmod 644 /usr/share/fonts/chinese/*.ttf # 更新系统字体缓存 sudo fc-cache -fv # 重建字体配置(某些系统需要) sudo mkfontscale sudo mkfontdir方式三:Matplotlib私有字体目录(适用于虚拟环境或容器)
当你在Python虚拟环境或Docker容器中工作时,可以避免修改系统或用户配置:
import matplotlib from pathlib import Path # 获取Matplotlib字体目录 matplotlib_font_dir = Path(matplotlib.get_data_path()) / "fonts" / "ttf" # 创建目标目录(如果不存在) matplotlib_font_dir.mkdir(parents=True, exist_ok=True) # 复制字体文件 import shutil shutil.copy("SourceHanSansSC-Regular.ttf", matplotlib_font_dir) # 这种方法需要清除Matplotlib缓存并重启Python进程2.3 离线环境的字体部署方案
在生产服务器或隔离网络中,你可能无法直接从网上下载字体。这时需要提前准备:
字体包预下载:
# 在可联网的机器上准备字体包 mkdir chinese-fonts cd chinese-fonts # 下载思源黑体全套(可选) wget https://github.com/adobe-fonts/source-han-sans/releases/download/2.004R/SourceHanSansSC.zip unzip SourceHanSansSC.zip # 或只下载需要的字重 wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf wget https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Bold.otf # 打包 tar czf chinese-fonts.tar.gz *.otf install-fonts.sh创建安装脚本
install-fonts.sh:#!/bin/bash # 安装脚本示例 set -e FONT_DIR="${1:-$HOME/.local/share/fonts}" mkdir -p "$FONT_DIR" # 复制所有.otf或.ttf文件 cp *.otf *.ttf "$FONT_DIR/" 2>/dev/null || true # 更新字体缓存 fc-cache -fv "$FONT_DIR" echo "字体已安装到: $FONT_DIR" echo "请重启Python进程或清除Matplotlib缓存"通过SCP或其他方式传输到目标服务器:
scp chinese-fonts.tar.gz user@server:/tmp/ ssh user@server "cd /tmp && tar xzf chinese-fonts.tar.gz && bash install-fonts.sh"
3. Matplotlib配置:从临时修改到永久生效
字体安装好了,接下来是告诉Matplotlib使用这些字体。这里有多种配置方式,各有适用场景。
3.1 方法一:运行时动态配置(临时解决方案)
适合快速测试或一次性脚本:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm # 方法A:直接指定字体文件路径 font_path = '/home/username/.local/share/fonts/SourceHanSansSC-Regular.ttf' font_prop = fm.FontProperties(fname=font_path) plt.figure(figsize=(10, 6)) plt.plot([1, 2, 3, 4], [1, 4, 9, 16]) plt.title('销售数据趋势分析', fontproperties=font_prop, fontsize=16) plt.xlabel('时间(季度)', fontproperties=font_prop) plt.ylabel('销售额(万元)', fontproperties=font_prop) plt.grid(True, alpha=0.3) # 设置刻度标签字体 for label in plt.gca().get_xticklabels() + plt.gca().get_yticklabels(): label.set_fontproperties(font_prop) plt.show()这种方法的问题很明显:每个文本元素都要单独设置,代码冗长,且无法应用于图例等其他元素。
3.2 方法二:rcParams全局配置(脚本级解决方案)
更优雅的方式是修改Matplotlib的运行时参数:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm import numpy as np # 查找已安装的中文字体 chinese_fonts = [f.name for f in fm.fontManager.ttflist if 'Source Han Sans' in f.name or '思源' in f.name or 'SimHei' in f.name] if chinese_fonts: # 设置全局字体 plt.rcParams['font.sans-serif'] = [chinese_fonts[0]] + plt.rcParams['font.sans-serif'] plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 print(f"已设置中文字体: {chinese_fonts[0]}") else: print("警告:未找到中文字体,将使用默认字体") # 现在可以正常使用中文 plt.figure(figsize=(12, 8)) # 生成示例数据 x = np.linspace(0, 10, 100) categories = ['产品A', '产品B', '产品C', '产品D'] values = np.random.randn(4, 100).cumsum(axis=1) for i, (cat, val) in enumerate(zip(categories, values)): plt.plot(x, val, label=cat, linewidth=2) plt.title('多产品线随时间变化趋势', fontsize=18, pad=20) plt.xlabel('时间(天)', fontsize=14) plt.ylabel('指标值', fontsize=14) plt.legend(title='产品类别', title_fontsize=13, fontsize=11) plt.grid(True, alpha=0.3, linestyle='--') # 添加中文标注示例 plt.text(5, max(values.flatten()) * 0.9, '峰值增长期', fontsize=12, bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.3)) plt.tight_layout() plt.show()这种方法的优点是整个脚本中所有图表都会使用中文字体,缺点是每次运行脚本都需要执行这些配置代码。
3.3 方法三:修改matplotlibrc配置文件(永久解决方案)
对于需要长期稳定工作的环境,修改配置文件是最可靠的方法。
步骤1:定位配置文件
import matplotlib print("配置文件位置:", matplotlib.matplotlib_fname())输出类似:/home/username/.local/lib/python3.8/site-packages/matplotlib/mpl-data/matplotlibrc
步骤2:创建用户级配置文件(推荐)
不要直接修改系统级的配置文件,而是创建用户级别的副本:
# 获取Matplotlib配置目录 python -c "import matplotlib; import os; print(os.path.dirname(matplotlib.matplotlib_fname()))" # 创建用户配置目录 mkdir -p ~/.config/matplotlib/ # 复制默认配置(如果不存在) python -c "import matplotlib; import shutil; import os; src=matplotlib.matplotlib_fname(); dst=os.path.expanduser('~/.config/matplotlib/matplotlibrc'); shutil.copy2(src, dst) if not os.path.exists(dst) else print('文件已存在')"步骤3:编辑配置文件
打开~/.config/matplotlib/matplotlibrc,找到并修改以下行:
# 大约在第200行左右找到字体相关配置 font.family : sans-serif # 在font.sans-serif列表的开头添加你的中文字体 font.sans-serif : Source Han Sans SC, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif # 解决负号显示问题 axes.unicode_minus : False # 可选:设置默认字体大小 font.size : 12.0 axes.titlesize : 16.0 axes.labelsize : 14.0 xtick.labelsize : 12.0 ytick.labelsize : 12.0 legend.fontsize : 11.0 figure.titlesize : 18.0步骤4:清除字体缓存
修改配置后,必须清除Matplotlib的缓存:
# 删除缓存文件 rm -rf ~/.cache/matplotlib rm -rf ~/.matplotlib/*.cache rm -rf ~/.matplotlib/fontlist-*.json # 或者在Python中强制重建缓存 python -c "import matplotlib.font_manager; matplotlib.font_manager._rebuild()"3.4 方法四:使用mplfonts工具(现代化方案)
最近社区出现了一个专门解决这个问题的工具——mplfonts,它简化了整个流程:
# 安装 pip install mplfonts # 初始化(会自动下载和配置中文字体) mplfonts init # 在代码中使用 import matplotlib.pyplot as plt from mplfonts import use_font # 使用特定字体 use_font('Source Han Sans SC') # 思源黑体 # 或 use_font('SimHei') # 黑体 # 现在可以正常使用中文 plt.plot([1, 2, 3], [4, 5, 6]) plt.title('中文标题示例') plt.show()mplfonts的优点:
- 自动处理字体下载和安装
- 支持多种中文字体
- 提供字体管理功能
- 兼容虚拟环境和容器
缺点:
- 需要网络连接下载字体
- 增加了项目依赖
4. 高级场景与疑难问题排查
即使按照上述步骤操作,有时还是会遇到问题。这部分分享一些高级场景的解决方案和常见问题的排查方法。
4.1 Docker容器中的字体配置
在Docker容器中配置中文字体需要特别注意,因为容器通常是精简的系统镜像。
Dockerfile示例:
FROM python:3.9-slim # 安装系统依赖和字体工具 RUN apt-get update && apt-get install -y \ wget \ fontconfig \ && rm -rf /var/lib/apt/lists/* # 创建字体目录 RUN mkdir -p /usr/share/fonts/chinese/ # 下载并安装思源黑体 RUN wget -q -O /tmp/SourceHanSansSC.zip \ https://github.com/adobe-fonts/source-han-sans/releases/download/2.004R/SourceHanSansSC.zip \ && unzip -q /tmp/SourceHanSansSC.zip -d /tmp/ \ && cp /tmp/SourceHanSansSC/OTF/SimplifiedChinese/*.otf /usr/share/fonts/chinese/ \ && rm -rf /tmp/SourceHanSansSC.zip /tmp/SourceHanSansSC # 或者使用更小的字体包(只包含Regular和Bold) RUN wget -q -O /usr/share/fonts/chinese/SourceHanSansSC-Regular.otf \ https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Regular.otf \ && wget -q -O /usr/share/fonts/chinese/SourceHanSansSC-Bold.otf \ https://github.com/adobe-fonts/source-han-sans/raw/release/OTF/SimplifiedChinese/SourceHanSansSC-Bold.otf # 配置字体 RUN chmod 644 /usr/share/fonts/chinese/*.otf \ && fc-cache -fv # 安装Python包 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 设置Matplotlib配置 ENV MATPLOTLIBRC=/etc/matplotlibrc RUN echo "font.family : sans-serif" > /etc/matplotlibrc \ && echo "font.sans-serif : Source Han Sans SC, DejaVu Sans, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif" >> /etc/matplotlibrc \ && echo "axes.unicode_minus : False" >> /etc/matplotlibrc WORKDIR /app COPY . . CMD ["python", "app.py"]关键点:
- 使用
slim镜像时,需要手动安装fontconfig - 字体文件要放在系统字体目录并设置正确权限
- 必须运行
fc-cache更新字体缓存 - 通过环境变量
MATPLOTLIBRC指定配置文件位置
4.2 Jupyter Notebook/Lab中的特殊处理
在Jupyter环境中,Matplotlib的缓存机制可能导致配置不立即生效:
# 在Jupyter中强制重新加载配置 import matplotlib matplotlib.rcParams.update(matplotlib.rcParamsDefault) # 重置为默认 # 重新设置中文字体 import matplotlib.font_manager as fm import matplotlib.pyplot as plt # 方法1:直接修改rcParams plt.rcParams['font.sans-serif'] = ['Source Han Sans SC'] plt.rcParams['axes.unicode_minus'] = False # 方法2:使用IPython魔法命令(在Notebook开头) %config InlineBackend.figure_format = 'retina' %matplotlib inline # 清除Matplotlib缓存 import matplotlib matplotlib.font_manager._rebuild() # 重启内核是最彻底的方法 print("如果字体仍不生效,请尝试:Kernel -> Restart & Clear Output")4.3 常见问题排查指南
当中文仍然显示为方块时,按以下步骤排查:
步骤1:检查字体是否真的安装成功
import matplotlib.font_manager as fm import subprocess # 方法A:使用Matplotlib的字体管理器 all_fonts = [f.name for f in fm.fontManager.ttflist] chinese_fonts = [f for f in all_fonts if any(keyword in f for keyword in ['Song', 'Hei', 'Yuan', 'Kai', 'Fang', 'Source', '思源', '文泉'])] print("找到的中文字体:", chinese_fonts[:10]) # 显示前10个 # 方法B:使用系统命令 result = subprocess.run(['fc-list', ':lang=zh'], capture_output=True, text=True) print("\n系统识别的中文字体:") print(result.stdout[:500]) # 显示前500字符步骤2:检查Matplotlib的字体缓存
import matplotlib import json import os # 查找缓存文件 cache_dir = os.path.join(matplotlib.get_cachedir(), 'fontlist-*.json') print("缓存目录:", matplotlib.get_cachedir()) # 查看缓存内容 import glob cache_files = glob.glob(os.path.join(matplotlib.get_cachedir(), 'fontlist-*.json')) if cache_files: with open(cache_files[0], 'r') as f: cache_data = json.load(f) # 检查缓存中是否有中文字体 chinese_in_cache = [f for f in cache_data if any(keyword in f.get('name', '') for keyword in ['Source', 'SimHei', 'WenQuanYi'])] print(f"缓存中的中文字体数量: {len(chinese_in_cache)}")步骤3:手动指定字体路径测试
# 如果常规方法无效,尝试绝对路径 font_path = '/usr/share/fonts/chinese/SourceHanSansSC-Regular.otf' if os.path.exists(font_path): import matplotlib.font_manager as fm import matplotlib.pyplot as plt # 手动添加字体 fm.fontManager.addfont(font_path) font_name = fm.FontProperties(fname=font_path).get_name() # 立即使用 plt.rcParams['font.sans-serif'] = [font_name] plt.rcParams['axes.unicode_minus'] = False print(f"手动加载字体: {font_name}") # 测试 plt.figure() plt.text(0.5, 0.5, '中文测试', fontsize=20, ha='center') plt.axis('off') plt.show() else: print(f"字体文件不存在: {font_path}")步骤4:检查字体文件权限和完整性
# 检查字体文件权限 ls -la /usr/share/fonts/chinese/ # 或 ~/.local/share/fonts/ # 正确的权限应该是 -rw-r--r-- (644) # 如果不是,修复权限 sudo chmod 644 /usr/share/fonts/chinese/*.ttf # 检查字体文件是否损坏 fc-query /usr/share/fonts/chinese/SourceHanSansSC-Regular.otf # 如果有输出,说明字体文件正常4.4 性能优化与最佳实践
当处理大量图表或需要高性能渲染时,字体配置也会影响性能:
预加载字体:在应用启动时加载字体,避免每次绘图都重新查找
# 在应用初始化时执行 import matplotlib matplotlib.font_manager._rebuild() # 重建缓存 matplotlib.rcParams['font.sans-serif'] = ['Source Han Sans SC'] matplotlib.rcParams['axes.unicode_minus'] = False使用字体子集:如果只需要少量汉字,可以创建字体子集减小文件大小
from fontTools.subset import subset # 创建只包含常用汉字的字体子集 common_chars = "的一是在不了有和人这中大为上个国我以要他时来用们生到作地于出就分对成会可主发年动同工也能下过子说产种面而方后多定行学法所民得经十三之进着等部度家电力里如水化高自二理起小物现实加量都两体制机当使点从业本去把性好应开它合还因由其些然前外天政四日那社义事平形相全表间样与关各重新线内数正心反你明看原又么利比或但质气第向道命此变条只没结解问意建月公无系军很情者最立代想已通并提直题党程展五果料象员革位入常文总次品式活设及管特件长求老头基资边流路级少图山统接知较将组见计别她手角期根论运农指几九区强放决西被干做必战先回则任取据处队南给色光门即保治北造百规热领七海口东导器压志世金增争济阶油思术极交受联什认六共权收证改清己美再采转更单风切打白教速花带安场身车例真务具万每目至达走积示议声报斗完类八离华名确才科张信马节话米整空元况今集温传土许步群广石记需段研界拉林律叫且究观越织装影算低持音众书布复容儿须际商非验连断深难近矿千周委素技备半办青省列习响约支般史感劳便团往酸历市克何除消构府称太准精值号率族维划选标写存候毛亲快效斯院查江型眼王按格养易置派层片始却专状育厂京识适属圆包火住调满县局照参红细引听该铁价严龙飞" # 使用fonttools创建子集(需要安装fonttools) # pip install fonttools缓存渲染结果:对于静态报告,可以预渲染图表保存为图片
import matplotlib.pyplot as plt import hashlib import os def get_cached_plot(data, title, cache_dir='plot_cache'): # 创建缓存键 cache_key = hashlib.md5(f"{str(data)}{title}".encode()).hexdigest() cache_file = os.path.join(cache_dir, f"{cache_key}.png") # 如果缓存存在,直接返回 if os.path.exists(cache_file): return cache_file # 否则创建图表 plt.figure(figsize=(10, 6)) plt.plot(data) plt.title(title) plt.tight_layout() # 保存到缓存 os.makedirs(cache_dir, exist_ok=True) plt.savefig(cache_file, dpi=150, bbox_inches='tight') plt.close() return cache_file
4.5 多字体混合使用技巧
有时我们需要在同一个图表中使用不同的字体,比如中文标题用黑体,英文标签用等宽字体:
import matplotlib.pyplot as plt import matplotlib.font_manager as fm import numpy as np # 配置多种字体 plt.rcParams['font.sans-serif'] = ['Source Han Sans SC', 'DejaVu Sans'] plt.rcParams['font.monospace'] = ['DejaVu Sans Mono'] plt.rcParams['axes.unicode_minus'] = False # 创建图表 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) # 第一个子图:混合中英文 x = np.linspace(0, 10, 100) y1 = np.sin(x) y2 = np.cos(x) ax1.plot(x, y1, label='sin(x)曲线', linewidth=2) ax1.plot(x, y2, label='cos(x)波形', linewidth=2, linestyle='--') ax1.set_title('三角函数比较 Trigonometric Functions', fontsize=16, pad=20) ax1.set_xlabel('时间轴 Time Axis') ax1.set_ylabel('振幅 Amplitude') ax1.legend(title='图例 Legend') ax1.grid(True, alpha=0.3) # 第二个子图:使用不同字体属性 ax2.bar(['项目A', 'Project B', '任务C', 'Task D'], [23, 45, 56, 34], color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4']) # 单独设置某些文本的字体 ax2.set_title('项目进度对比', fontdict={'fontname': 'Source Han Sans SC', 'fontsize': 16, 'fontweight': 'bold'}) # X轴标签使用默认字体(中英文混合) ax2.set_xlabel('项目名称 Project Name') # Y轴标签使用稍小的字体 ax2.set_ylabel('完成百分比 (%)', fontsize=12) # 在图表中添加多语言注释 ax2.text(1, 50, '最高值\nPeak Value', fontsize=10, ha='center', bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.3)) plt.tight_layout() plt.show()这种混合字体配置的关键在于:
- 在
rcParams中设置字体回退链 - 使用
fontdict参数单独设置特定文本的字体属性 - 确保所有需要的字体都已正确安装
经过这些配置,你的Matplotlib图表应该能完美显示中文了。如果还有问题,通常是字体缓存没有更新,或者字体文件路径不正确。记住这个排查顺序:先确认字体安装成功(fc-list),再检查Matplotlib缓存,最后验证配置文件。
