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.