Нарисовать таблицу шрифта с использованием Matplotlib

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Matplotlib - популярная библиотека визуализации данных в Python. Она обеспечивает поддержку шрифтов с помощью библиотеки FreeType. В этом практическом занятии мы узнаем, как с помощью Axes.table Matplotlib нарисовать таблицу шрифтов первых 255 символов заданного шрифта.

Советы по работе с ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Распечатать глифы в шрифте

В этом шаге мы определим функцию print_glyphs, которая выводит все глифы из заданного файла шрифта в стандартный вывод.

import os
import unicodedata
import matplotlib.font_manager as fm
from matplotlib.ft2font import FT2Font

def print_glyphs(path):
    """
    Print the all glyphs in the given font file to stdout.

    Parameters
    ----------
    path : str or None
        The path to the font file.  If None, use Matplotlib's default font.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## The default font.

    font = FT2Font(path)

    charmap = font.get_charmap()
    max_indices_len = len(str(max(charmap.values())))

    print("The font face contains the following glyphs:")
    for char_code, glyph_index in charmap.items():
        char = chr(char_code)
        name = unicodedata.name(
                char,
                f"{char_code:#x} ({font.get_glyph_name(glyph_index)})")
        print(f"{glyph_index:>{max_indices_len}} {char} {name}")

Распечатать глифы в шрифте

В этом шаге мы определим функцию print_glyphs, которая выводит все глифы из заданного файла шрифта в стандартный вывод.

import os
import unicodedata
import matplotlib.font_manager as fm
from matplotlib.ft2font import FT2Font

def print_glyphs(path):
    """
    Распечатать все глифы из заданного файла шрифта в стандартный вывод.

    Аргументы
    ----------
    path : str или None
        Путь к файлу шрифта. Если None, использовать стандартный шрифт Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## Стандартный шрифт.

    font = FT2Font(path)

    charmap = font.get_charmap()
    max_indices_len = len(str(max(charmap.values())))

    print("В этом шрифте содержатся следующие глифы:")
    for char_code, glyph_index in charmap.items():
        char = chr(char_code)
        name = unicodedata.name(
                char,
                f"{char_code:#x} ({font.get_glyph_name(glyph_index)})")
        print(f"{glyph_index:>{max_indices_len}} {char} {name}")

Нарисовать таблицу шрифта

В этом шаге мы определим функцию draw_font_table, которая рисует таблицу шрифта первых 255 символов заданного шрифта.

import os
from pathlib import Path
import unicodedata
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from matplotlib.ft2font import FT2Font

def draw_font_table(path):
    """
    Нарисовать таблицу шрифта первых 255 символов заданного шрифта.

    Параметры
    ----------
    path : str или None
        Путь к файлу шрифта. Если None, использовать стандартный шрифт Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## Стандартный шрифт.

    font = FT2Font(path)

    ## Получить карту символов шрифта
    codes = font.get_charmap().items()

    ## Создать метки и ячейки таблицы
    labelc = [f"{i:X}" for i in range(16)]
    labelr = [f"{i:02X}" for i in range(0, 16*16, 16)]
    chars = [["" for c in range(16)] for r in range(16)]

    for char_code, glyph_index in codes:
        if char_code >= 256:
            continue
        row, col = divmod(char_code, 16)
        chars[row][col] = chr(char_code)

    ## Нарисовать таблицу с использованием Axes.table Matplotlib
    fig, ax = plt.subplots(figsize=(8, 4))
    ax.set_title(os.path.basename(path))
    ax.set_axis_off()

    table = ax.table(
        cellText=chars,
        rowLabels=labelr,
        colLabels=labelc,
        rowColours=["palegreen"] * 16,
        colColours=["palegreen"] * 16,
        cellColours=[[".95" for c in range(16)] for r in range(16)],
        cellLoc='center',
        loc='upper left',
    )

    ## Установить шрифт ячеек таблицы равным шрифту заданного пути
    for key, cell in table.get_celld().items():
        row, col = key
        if row > 0 and col > -1:  ## Будьте осторожны с необычным индексированием таблицы...
            cell.set_text_props(font=Path(path))

    fig.tight_layout()
    plt.show()

Отобразить таблицу шрифта

В этом шаге мы будем использовать argparse для разбора пути к файлу шрифта из аргументов командной строки. Затем мы вызовем print_glyphs, чтобы распечатать все глифы в файле шрифта, и draw_font_table, чтобы нарисовать таблицу шрифта первых 255 символов шрифта.

if __name__ == "__main__":
    from argparse import ArgumentParser

    parser = ArgumentParser(description="Display a font table.")
    parser.add_argument("path", nargs="?", help="Path to the font file.")
    parser.add_argument("--print-all", action="store_true",
                        help="Additionally, print all chars to stdout.")
    args = parser.parse_args()

    if args.print_all:
        print_glyphs(args.path)
    draw_font_table(args.path)

Резюме

В этом практическом занятии мы узнали, как с помощью Axes.table Matplotlib нарисовать таблицу шрифта первых 255 символов файла шрифта. Мы определили функции для печати всех глифов в файле шрифта и для рисования таблицы шрифта. Также мы использовали argparse для разбора пути к файлу шрифта из аргументов командной строки.