在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的字体目录:
- 先找到Matplotlib的字体路径:
import matplotlib print(matplotlib.get_data_path() + '/fonts/ttf') - 把下载的
.ttf字体文件复制到这个目录 - 重建Matplotlib字体缓存:
fm._rebuild() - 重启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()
阿拉伯文额外处理(可选)
阿拉伯文是从右到左排版的,单纯设置字体可能排版混乱,需要额外处理:
- 先安装依赖库:
pip install arabic-reshaper python-bidi - 代码中处理文字方向:
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
相关产品推荐
相关产品推荐

