Dibujar una tabla de fuentes con Matplotlib

Beginner

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

Introducción

Matplotlib es una popular biblioteca de visualización de datos en Python. Proporciona soporte para fuentes a través de la biblioteca FreeType. En este laboratorio, aprenderemos cómo dibujar una tabla de fuentes de los primeros 255 caracteres de una fuente dada utilizando Axes.table de Matplotlib.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.

Imprimir los glifos de una fuente

En este paso, definiremos una función print_glyphs que imprime todos los glifos de un archivo de fuente dado a la salida estándar.

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

def print_glyphs(path):
    """
    Imprime todos los glifos del archivo de fuente dado a la salida estándar.

    Parámetros
    ----------
    path : str o None
        La ruta al archivo de fuente. Si es None, se utiliza la fuente predeterminada de Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## La fuente predeterminada.

    font = FT2Font(path)

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

    print("La fuente contiene los siguientes 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}")

Dibujar una tabla de fuentes

En este paso, definiremos una función draw_font_table que dibuja una tabla de fuentes de los primeros 255 caracteres de la fuente dada.

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):
    """
    Dibuja una tabla de fuentes de los primeros 255 caracteres de la fuente dada.

    Parámetros
    ----------
    path : str o None
        La ruta al archivo de fuente. Si es None, se utiliza la fuente predeterminada de Matplotlib.
    """
    if path is None:
        path = fm.findfont(fm.FontProperties())  ## La fuente predeterminada.

    font = FT2Font(path)

    ## Obtiene el mapa de caracteres de la fuente
    codes = font.get_charmap().items()

    ## Crea las etiquetas y celdas de la tabla
    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)

    ## Dibuja la tabla utilizando Axes.table de 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',
    )

    ## Establece la fuente de las celdas de la tabla a la fuente de la ruta dada
    for key, cell in table.get_celld().items():
        row, col = key
        if row > 0 and col > -1:  ## Tenga cuidado con la indexación idiosincrática de la tabla...
            cell.set_text_props(font=Path(path))

    fig.tight_layout()
    plt.show()

Mostrar la tabla de fuentes

En este paso, usaremos argparse para analizar la ruta al archivo de fuente a partir de los argumentos de línea de comandos. Luego llamaremos a print_glyphs para imprimir todos los glifos del archivo de fuente y a draw_font_table para dibujar la tabla de fuentes de los primeros 255 caracteres de la fuente.

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

    parser = ArgumentParser(description="Mostrar una tabla de fuentes.")
    parser.add_argument("path", nargs="?", help="Ruta al archivo de fuente.")
    parser.add_argument("--print-all", action="store_true",
                        help="Además, imprima todos los caracteres a la salida estándar.")
    args = parser.parse_args()

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

Resumen

En este laboratorio, aprendimos cómo dibujar una tabla de fuentes de los primeros 255 caracteres de un archivo de fuente utilizando Axes.table de Matplotlib. Definimos funciones para imprimir todos los glifos de un archivo de fuente y para dibujar la tabla de fuentes. También usamos argparse para analizar la ruta al archivo de fuente a partir de los argumentos de línea de comandos.