Estilos de Caixa Personalizados em Matplotlib

Beginner

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

Introdução

Matplotlib é uma biblioteca de plotagem para a linguagem de programação Python e sua extensão de matemática numérica NumPy. Uma das características do Matplotlib é a capacidade de criar estilos de caixa (box styles) personalizados.

Neste laboratório, você aprenderá como implementar estilos de caixa personalizados no Matplotlib. Você aprenderá como criar um estilo de caixa personalizado como uma função e como uma classe. Você também aprenderá como registrar um estilo de caixa personalizado com o 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 a limitações no 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ê.

Implementar um estilo de caixa personalizado como uma função

Estilos de caixa personalizados podem ser implementados como funções que recebem argumentos especificando tanto uma caixa retangular quanto a quantidade de "mutação" (mutation), e retornam o caminho "mutado" (mutated). Aqui, implementaremos um estilo de caixa personalizado que retorna um novo caminho que adiciona uma forma de "seta" (arrow) no lado esquerdo da caixa.

import matplotlib.pyplot as plt
from matplotlib.patches import BoxStyle
from matplotlib.path import Path

def custom_box_style(x0, y0, width, height, mutation_size):
    """
    Dada a localização e o tamanho da caixa, retorna o caminho da caixa ao redor
    dela.

    A rotação é automaticamente tratada.

    Parâmetros
    ----------
    x0, y0, width, height : float
        Localização e tamanho da caixa.
    mutation_size : float
        Escala de referência da mutação, tipicamente o tamanho da fonte do texto.
    """
    ## padding
    mypad = 0.3
    pad = mutation_size * mypad
    ## largura e altura com padding adicionado.
    width = width + 2 * pad
    height = height + 2 * pad
    ## limite da caixa com padding
    x0, y0 = x0 - pad, y0 - pad
    x1, y1 = x0 + width, y0 + height
    ## retorna o novo caminho
    return Path([(x0, y0),
                 (x1, y0), (x1, y1), (x0, y1),
                 (x0-pad, (y0+y1)/2), (x0, y0),
                 (x0, y0)],
                closed=True)

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle=custom_box_style, alpha=0.2))
plt.show()

Implementar um estilo de caixa personalizado como uma classe

Estilos de caixa personalizados também podem ser implementados como classes que implementam __call__. As classes podem então ser registradas no dicionário BoxStyle._style_list, o que permite especificar o estilo da caixa como uma string, bbox=dict(boxstyle="registered_name,param=value,...", ...).

class MyStyle:
    """Uma caixa simples."""

    def __init__(self, pad=0.3):
        """
        Os argumentos devem ser floats e ter valores padrão.

        Parâmetros
        ----------
        pad : float
            Quantidade de preenchimento (padding).
        """
        self.pad = pad
        super().__init__()

    def __call__(self, x0, y0, width, height, mutation_size):
        """
        Dada a localização e o tamanho da caixa, retorna o caminho da caixa
        ao redor dela.

        A rotação é automaticamente tratada.

        Parâmetros
        ----------
        x0, y0, width, height : float
            Localização e tamanho da caixa.
        mutation_size : float
            Escala de referência para a mutação, tipicamente o tamanho da fonte do texto.
        """
        ## padding
        pad = mutation_size * self.pad
        ## largura e altura com padding adicionado
        width = width + 2.*pad
        height = height + 2.*pad
        ## limite da caixa com padding
        x0, y0 = x0 - pad, y0 - pad
        x1, y1 = x0 + width, y0 + height
        ## retorna o novo caminho
        return Path([(x0, y0),
                     (x1, y0), (x1, y1), (x0, y1),
                     (x0-pad, (y0+y1)/2.), (x0, y0),
                     (x0, y0)],
                    closed=True)


BoxStyle._style_list["angled"] = MyStyle  ## Registrar o estilo personalizado.

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))

del BoxStyle._style_list["angled"]  ## Remover o registro.

plt.show()

Registrar o estilo de caixa personalizado com Matplotlib

Depois de implementar um estilo de caixa personalizado como uma classe, você pode registrá-lo com Matplotlib. Isso permite que você especifique o estilo da caixa como uma string, bbox=dict(boxstyle="registered_name,param=value,...", ...).

BoxStyle._style_list["angled"] = MyStyle  ## Registrar o estilo personalizado.

Usar o estilo de caixa personalizado

Depois de implementar e registrar um estilo de caixa personalizado, você pode usá-lo com Axes.text.

fig, ax = plt.subplots(figsize=(3, 3))
ax.text(0.5, 0.5, "Test", size=30, va="center", ha="center", rotation=30,
        bbox=dict(boxstyle="angled,pad=0.5", alpha=0.2))

Resumo

Neste laboratório, você aprendeu como implementar estilos de caixa personalizados em Matplotlib. Você aprendeu como criar um estilo de caixa personalizado como uma função e como uma classe. Você também aprendeu como registrar um estilo de caixa personalizado com Matplotlib e como usá-lo com Axes.text.