import os
from pathlib import Path
from matplotlib import font_manager
def _setup_fonts():
# 1. 自动定位路径:找到脚本所在目录的父目录
root_dir = Path(__file__).resolve().parent.parent
font_dir = root_dir / 'data'
loaded_font_families = []
if font_dir.exists():
# 扫描 ttf 和 otf 文件
font_files = list(font_dir.glob('**/*.ttf')) + list(font_dir.glob('**/*.otf'))
for font_path in font_files:
try:
# 注册字体文件到 matplotlib
font_manager.fontManager.addfont(str(font_path))
# 获取字体的正式名称
prop = font_manager.FontProperties(fname=str(font_path))
loaded_font_families.append(prop.get_name())
except Exception as e:
print(f"无法加载字体 {font_path.name}: {e}")
# 2. 排序逻辑
# 要求:A-Z 排序,且标准体(Regular/Normal)排在变体(Bold/Light/Italic)之前
def font_sort_key(name):
name_lower = name.lower()
# 定义变体关键字
variant_keywords = ['bold', 'light', 'italic', 'oblique', 'thin', 'heavy', 'black', 'medium']
# 判断是否是变体
is_variant = any(word in name_lower for word in variant_keywords)
# 权重:标准体为 0,变体为 1 (确保标准体排在前面)
priority = 1 if is_variant else 0
return (name.lower(), priority, name)
# 去重并排序
unique_fonts = sorted(list(set(loaded_font_families)), key=font_sort_key)
# 3. 设置 matplotlib 全局参数
if unique_fonts:
# 将新发现的字体放在最前面,保留原有的 fallback
plt.rcParams['font.sans-serif'] = unique_fonts + plt.rcParams['font.sans-serif']
# print(f"已自动加载并设置字体排序: {unique_fonts}")
# 解决负号显示问题
plt.rcParams['axes.unicode_minus'] = False
_setup_fonts()
在 \utils\plot.py 开头增加,然后把字体文件放在data目录
PS:由Gemini生成