Matplotlib绘制条形图时,字典键自带的Unicode下标为何显示为空白框?
问题原因
Matplotlib 默认加载的内置 DejaVu Sans 字体没有收录 Unicode 标准下的下标区块字符(也就是字典键里用到的₄、₆、₈这类下标数字),渲染时找不到匹配的字形,就会输出空白方框的缺字提示。
解决方案
只要给Matplotlib指定一个完整覆盖Unicode下标字符的可用字体即可,全程不需要修改字典的键内容,也不需要把下标字符转成LaTeX语法格式:
- 可选的常用字体包括:SimHei(系统自带黑体)、Noto Sans CJK、Arial Unicode MS,这些字体的字形库都完整包含了0-9的下标字符
- 在脚本开头增加全局字体配置,替换Matplotlib的默认字体即可,原有绘图逻辑完全不用改动
修改后的完整可运行代码如下:
import numpy as np import matplotlib.pyplot as plt # 新增全局字体配置,指定支持Unicode下标的字体 plt.rcParams["font.family"] = ["SimHei", "Noto Sans CJK SC", "Arial Unicode MS"] plt.rcParams["axes.unicode_minus"] = False data = {'CO₆': 15, 'DO₄': 144, 'EO₈': 3, 'FaO₉': 1, 'GO₅': 7, 'Ha₆': 5} f, ax = plt.subplots(figsize = (40, 4)) bin = np.arange(len(data.keys())) ax.bar(data.keys(), data.values(), color='brown', align = "center", width = 0.3); plt.xticks(rotation='vertical'); ax.xaxis.set_tick_params(labelsize = 32); ax.yaxis.set_tick_params(labelsize = 32); plt.xlim(-0.5, bin.size-0.5); plt.show()
小提示:如果配置后仍然存在缺字,可以通过
matplotlib.font_manager.fontManager.ttflist查看本地已安装的字体列表,只要把列表里能正常显示下标字符的字体名替换到font.family的配置项里即可,不需要对原字典做任何修改。
内容的提问来源于stack exchange,提问作者hemanta
相关产品推荐
相关产品推荐

