Skip to content

设置Matplotlib字体 #298

@molehzy

Description

@molehzy

在 \utils\plot.py 开头增加,然后把字体文件放在data目录

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()

PS:由Gemini生成

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions