はじめに
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を使ってコマンドライン引数からフォントファイルへのパスを解析しました。