Matplotlib を使ってフォントテーブルを描画する

PythonPythonBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

Matplotlibは、Pythonにおける人気のあるデータ可視化ライブラリです。これは、FreeTypeライブラリを通じてフォントサポートを提供します。この実験では、MatplotlibのAxes.tableを使用して、指定されたフォントの最初の255文字のフォントテーブルを描画する方法を学びます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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):
    """
    指定されたフォントファイル内のすべてのグリフを標準出力に表示します。

    パラメータ
    ----------
    path : str or 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}")

フォントテーブルを描画する

このステップでは、指定されたフォントの最初の255文字のフォントテーブルを描画する関数draw_font_tableを定義します。

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

    ## MatplotlibのAxes.tableを使ってテーブルを描画する
    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を呼び出し、フォントの最初の255文字のフォントテーブルを描画するためにdraw_font_tableを呼び出します。

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)

まとめ

この実験では、MatplotlibのAxes.tableを使って、フォントファイルの最初の255文字のフォントテーブルを描画する方法を学びました。フォントファイル内のすべてのグリフを表示する関数と、フォントテーブルを描画する関数を定義しました。また、argparseを使ってコマンドライン引数からフォントファイルへのパスを解析しました。