You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Matplotlib中安装西里尔字体,解决IPython3 Notebook字符显示方块问题

嘿,这个方块占位符的问题我之前踩过好几次!本质就是Matplotlib默认用的字体不支持西里尔文或者阿拉伯文,导致字符无法渲染,变成了所谓的“tofu”(豆腐块)字符。下面给你一步步搞定:

问题根源

Matplotlib的默认字体(比如DejaVu Sans)只覆盖了拉丁字符集,对西里尔文、阿拉伯文这类非拉丁字符没有支持,所以渲染时就会用方块占位符替代无法识别的字符。

解决步骤

1. 先检查系统里有没有可用的西里尔字体

先在IPython Notebook里跑这段代码,看看你的系统已经安装了哪些支持西里尔文的字体:

import matplotlib.font_manager as fm
# 遍历系统字体,筛选带西里尔/阿拉伯支持的
for font_path in fm.findSystemFonts():
    font_prop = fm.FontProperties(fname=font_path)
    font_name = font_prop.get_name()
    if 'Cyrillic' in font_name or 'Arabic' in font_name:
        print(f"可用字体:{font_name} | 路径:{font_path}")

如果输出里能看到Noto Sans Cyrillic、Arial Unicode MS这类字体,那直接跳到第3步用就行;如果没有,先安装字体。

2. 安装支持西里尔文的字体

推荐用谷歌的Noto字体系列,它支持几乎所有语言,兼容性拉满:

不同系统的安装方式

  • Linux(Debian/Ubuntu):直接用包管理器安装
    sudo apt install fonts-noto-cyrillic
    
  • macOS:可以通过Font Book搜索安装「Noto Sans Cyrillic」,或者用Homebrew:
    brew install font-noto-sans-cyrillic
    
  • Windows:打开系统设置→个性化→字体,搜索「Noto Sans Cyrillic」安装;如果搜不到,直接从微软字体库下载后双击安装即可。

手动安装到Matplotlib(可选)

如果系统安装后Matplotlib没识别到,把字体文件复制到Matplotlib的字体目录:

  1. 先找到Matplotlib的字体路径:
    import matplotlib
    print(matplotlib.get_data_path() + '/fonts/ttf')
    
  2. 把下载的.ttf字体文件复制到这个目录
  3. 重建Matplotlib字体缓存:
    fm._rebuild()
    
  4. 重启IPython Notebook,字体就加载成功了。

3. 在代码中指定使用西里尔字体

有两种方式,按需选择:

全局设置(所有图表生效)

在Notebook开头加这段代码,后续所有图表都会默认用西里尔字体:

import matplotlib.pyplot as plt

# 设置全局字体为Noto Sans Cyrillic(换成你找到的字体名)
plt.rcParams['font.family'] = 'Noto Sans Cyrillic'
# 避免负号变成方块
plt.rcParams['axes.unicode_minus'] = False

单个图表设置(仅当前图生效)

如果不想影响全局,只为特定图表指定字体:

import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 加载字体(可以用字体名或者路径)
cyrillic_font = FontProperties(family='Noto Sans Cyrillic')
# 阿拉伯文可以用对应的阿拉伯字体,比如'Noto Sans Arabic'

plt.plot([1,2,3], [4,5,6])
plt.xlabel('西里尔文标签:Привет мир', fontproperties=cyrillic_font)
plt.ylabel('阿拉伯文标签:مرحبا بالعالم', fontproperties=FontProperties(family='Noto Sans Arabic'))
plt.show()

阿拉伯文额外处理(可选)

阿拉伯文是从右到左排版的,单纯设置字体可能排版混乱,需要额外处理:

  1. 先安装依赖库:
    pip install arabic-reshaper python-bidi
    
  2. 代码中处理文字方向:
    import arabic_reshaper
    from bidi.algorithm import get_display
    
    original_text = 'مرحبا بالعالم'
    # 重塑阿拉伯文结构
    reshaped_text = arabic_reshaper.reshape(original_text)
    # 调整排版方向
    bidi_text = get_display(reshaped_text)
    
    plt.xlabel(bidi_text, fontproperties=FontProperties(family='Noto Sans Arabic'))
    
测试示例

跑这段代码验证效果:

import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

# 确保字体缓存已重建
fm._rebuild()

# 全局设置西里尔字体
plt.rcParams['font.family'] = 'Noto Sans Cyrillic'
plt.rcParams['axes.unicode_minus'] = False

# 绘制测试图
plt.figure(figsize=(10,6))
plt.plot([1,2,3,4], [10,20,15,25])
plt.title('Тест с кириллицей (Cyrillic Test)', fontsize=16)
plt.xlabel('Ось X:Месяцы (Months)', fontsize=12)
plt.ylabel('Ось Y:Значения (Values)', fontsize=12)
plt.xticks([1,2,3,4], ['Янв', 'Фев', 'Мар', 'Апр'])
plt.show()

内容的提问来源于stack exchange,提问作者ambrish dhaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:53:26