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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions