如何在Matplotlib同一坐标轴刻度标签中使用多字体实现英印地语混显?
解决混淆矩阵坐标轴同时显示英文与印地语字符的问题
我明白你想在混淆矩阵的X/Y轴刻度标签上同时展示英文和印地语字符,但目前设置Lohit Devanagari字体后没达到预期效果——别担心,咱们一步步来搞定这个问题。
问题根源
单独给xticks/yticks指定字体时,可能遇到两个核心问题:
- 所选字体(比如Lohit Devanagari)对英文字符的支持不够完善,或者Matplotlib的渲染逻辑没有正确识别混合字符的字体需求;
- 仅设置
fontname可能没有覆盖到所有文本渲染环节,导致部分字符仍用默认字体显示。
具体解决方案
1. 使用同时支持双语言的字体(推荐)
优先选择同时包含英文和印地语字符集的字体,比如谷歌开源的Noto Sans Devanagari,它专门为多语言场景设计,能完美适配混合文本。
操作步骤:
- 先确认系统已安装该字体:
- Ubuntu/Debian:执行
sudo apt install fonts-noto-devanagari - Windows/macOS:直接从官方渠道下载安装即可
- Ubuntu/Debian:执行
- 全局配置Matplotlib使用该字体(比单独设置刻度更稳定):
import matplotlib.pyplot as plt # 全局设置字体,优先用Noto Sans Devanagari, fallback到系统默认无衬线字体 plt.rcParams['font.family'] = ['Noto Sans Devanagari', 'sans-serif'] plt.rcParams['font.size'] = 6 # 匹配你需要的labelsize
2. 单独为刻度标签设置字体(如果需要局部调整)
如果你不想全局修改字体,可以手动为刻度标签指定支持双语言的字体,同时确保你的标签字符串是正确的混合格式:
# 示例:混合英文与印地语的刻度标签 tick_labels = ["Cat (बिल्ली)", "Dog (कुत्ता)", "Bird (पक्षी)"] # 重新设置X/Y轴刻度标签并指定字体 ax.set_xticklabels(tick_labels, fontname='Noto Sans Devanagari', fontsize=6) ax.set_yticklabels(tick_labels, fontname='Noto Sans Devanagari', fontsize=6)
3. 保留你的刻度显示设置
你之前开启两侧刻度的代码是正确的,直接保留即可:
ax.tick_params(labeltop=True, labelright=True, labelsize=6) ax.yaxis.set_ticks_position('both') ax.xaxis.set_ticks_position('both')
额外验证小技巧
如果还是有问题,可以先打印一下当前Matplotlib可用的字体列表,确认目标字体是否被识别:
import matplotlib.font_manager as fm for font in fm.findSystemFonts(fontpaths=None, fontext='ttf'): if 'Devanagari' in font or 'Noto' in font: print(fm.FontProperties(fname=font).get_name())
内容的提问来源于stack exchange,提问作者PeacefulDaemon
相关产品推荐
相关产品推荐

