如何在Matplotlib数据表中使用Wingdings 3字符?
如何在Matplotlib数据表中使用Wingdings 3字符?
我来帮你解决这个问题~你遇到的核心问题是Wingdings这类特殊字体的字符映射逻辑和普通ASCII字体不一样:Matplotlib是严格按字符的Unicode码点去字体文件里匹配对应字形的,但你用的小写字母k/m/g的码点(比如k是0x6B)在Wingdings 3字体中根本没有对应的箭头字形,所以才会报“Glyph缺失”的错误;而Word能正常显示,是因为它用了旧的编码映射规则,和Matplotlib的逻辑不兼容。
下面是具体的解决步骤:
步骤1:获取Wingdings 3箭头对应的正确Unicode字符
Wingdings 3的箭头字形都在Unicode的私人使用区(PUA),对应你需要的三个箭头的正确Unicode转义符是:
- 向上箭头(对应Word里的
k):'\uf04b' - 向下箭头(对应Word里的
m):'\uf04d' - 向右箭头(对应Word里的
g):'\uf047'
步骤2:修改代码中的箭头定义
把你原来用小写字母定义箭头的代码,替换成上面的Unicode转义符。
步骤3:确保Matplotlib能精准加载Wingdings 3字体
有时候通过fontname='Wingdings 3'指定字体可能出现识别错误,更稳妥的方法是直接指定字体文件的路径(Windows系统下Wingdings 3默认路径是C:/Windows/Fonts/wingding3.ttf,macOS/Linux需要自行查找字体文件位置),用FontProperties类加载字体。
修改后的完整可运行代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd from matplotlib.font_manager import FontProperties # 加载Wingdings 3字体,替换为你系统中字体文件的实际路径 # Windows默认路径示例 wingdings3 = FontProperties(fname='C:/Windows/Fonts/wingding3.ttf') # macOS路径示例:'/Library/Fonts/Wingdings 3.ttf' df = pd.DataFrame({"Before":[1,4,7,5,8,2,5,7], "After":[2,7,9,1,9,2,7,3]}) df["Change"]=df["After"]-df["Before"] # 定义正确的Unicode箭头字符 up_arrow = '\uf04b' # 向上箭头 down_arrow = '\uf04d' # 向下箭头 right_arrow = '\uf047' # 向右箭头 # 生成箭头行 arrchg_row = [] for change in df["Change"]: if change > 0: arrchg_row.append(up_arrow) elif change < 0: arrchg_row.append(down_arrow) else: arrchg_row.append(right_arrow) cell_text = [df["Before"].values, df["After"].values, df["Change"].values, arrchg_row] fig, ax = plt.subplots() fig.patch.set_visible(False) ax.axis('off') ax.axis('tight') # 创建表格 rect=ax.table( cellText=cell_text, rowLabels=["Bef", "Arf", "chg", "arrchg"], loc='lower center', cellLoc='center' ) # 设置字体样式 for (i, j), cell in rect.get_celld().items(): if i < 3: cell.set_fontsize(12) cell.set_text_props(fontname='Arial') else: cell.set_fontsize(12) cell.set_text_props(fontproperties=wingdings3) fig.tight_layout() plt.show()
额外排查技巧
如果还是出现问题,可以先确认系统里的Wingdings 3字体路径是否正确,运行下面的代码可以搜索系统中所有带Wingdings的字体文件:
import matplotlib.font_manager as fm for font_path in fm.findSystemFonts(): if 'Wingdings' in font_path: print(font_path)
把输出的Wingdings 3路径替换到代码的fname参数里即可。
备注:内容来源于stack exchange,提问作者Baldy
相关产品推荐
相关产品推荐

