Desenhar Tabela de Fontes com Matplotlib

Beginner

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

Introdução

Matplotlib é uma popular biblioteca de visualização de dados em Python. Ela oferece suporte a fontes através da biblioteca FreeType. Neste laboratório, aprenderemos como desenhar uma tabela de fontes dos primeiros 255 caracteres de uma determinada fonte usando Axes.table do Matplotlib.

Dicas para a VM

Após a inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook e acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido às limitações do Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema prontamente para você.

Imprimir os glifos em uma fonte

Nesta etapa, definiremos uma função print_glyphs que imprime todos os glifos em um determinado arquivo de fonte para a saída padrão (stdout).

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

def print_glyphs(path):
    """
    Imprime todos os glifos no arquivo de fonte fornecido para a saída padrão.

    Parâmetros
    ----------
    path : str ou None
        O caminho para o arquivo de fonte. Se None, use a fonte padrão do Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## A fonte padrão.

    font = FT2Font(path)

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

    print("A face da fonte contém os seguintes glifos:")
    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}")

Desenhar uma tabela de fontes

Nesta etapa, definiremos uma função draw_font_table que desenha uma tabela de fontes dos primeiros 255 caracteres da fonte fornecida.

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):
    """
    Desenha uma tabela de fontes dos primeiros 255 caracteres da fonte fornecida.

    Parâmetros
    ----------
    path : str ou None
        O caminho para o arquivo de fonte. Se None, use a fonte padrão do Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## A fonte padrão.

    font = FT2Font(path)

    ## Obter o charmap da fonte
    codes = font.get_charmap().items()

    ## Criar os rótulos e células da tabela
    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)

    ## Desenhar a tabela usando Axes.table do 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',
    )

    ## Definir a fonte das células da tabela para a fonte do caminho fornecido
    for key, cell in table.get_celld().items():
        row, col = key
        if row > 0 and col > -1:  ## Cuidado com a indexação idiossincrática da tabela...
            cell.set_text_props(font=Path(path))

    fig.tight_layout()
    plt.show()

Exibir a tabela de fontes

Nesta etapa, usaremos argparse para analisar o caminho para o arquivo de fonte a partir dos argumentos da linha de comando. Em seguida, chamaremos print_glyphs para imprimir todos os glifos no arquivo de fonte e draw_font_table para desenhar a tabela de fontes dos primeiros 255 caracteres da fonte.

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

    parser = ArgumentParser(description="Exibir uma tabela de fontes.")
    parser.add_argument("path", nargs="?", help="Caminho para o arquivo de fonte.")
    parser.add_argument("--print-all", action="store_true",
                        help="Adicionalmente, imprimir todos os caracteres para stdout.")
    args = parser.parse_args()

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

Resumo

Neste laboratório, aprendemos como desenhar uma tabela de fontes dos primeiros 255 caracteres de um arquivo de fonte usando Axes.table do Matplotlib. Definimos funções para imprimir todos os glifos em um arquivo de fonte e para desenhar a tabela de fontes. Também usamos argparse para analisar o caminho para o arquivo de fonte a partir dos argumentos da linha de comando.