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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:44:29