Criando Donuts Usando path.Path e patches.PathPatch

Beginner

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

Introdução

Neste tutorial, criaremos um donut usando ~.path.Path e ~.patches.PathPatch do Matplotlib. Usaremos a função make_circle() para criar o círculo e concatenaremos os subcaminhos interno e externo para criar o donut.

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ê.

Importando as Bibliotecas Necessárias

Começaremos importando as bibliotecas necessárias para este tutorial.

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
import matplotlib.path as mpath

Definindo a Função Auxiliar

Definiremos uma função auxiliar wise() para determinar a orientação do caminho (path).

def wise(v):
    if v == 1:
        return "CCW"
    else:
        return "CW"

Criando o Círculo

Criaremos o círculo usando a função make_circle(). A função recebe o raio do círculo como entrada e retorna as coordenadas x e y do círculo.

def make_circle(r):
    t = np.arange(0, np.pi * 2.0, 0.01)
    t = t.reshape((len(t), 1))
    x = r * np.cos(t)
    y = r * np.sin(t)
    return np.hstack((x, y))

Criando o Donut

Criaremos o donut concatenando os subcaminhos interno e externo. Usaremos codes para especificar o tipo de cada vértice (MOVETO, LINETO, etc.). Em seguida, criaremos um objeto Path usando mpath.Path e um objeto PathPatch usando mpatches.PathPatch. Finalmente, adicionaremos o objeto PathPatch ao objeto Axes usando ax.add_patch().

Path = mpath.Path
fig, ax = plt.subplots()

inside_vertices = make_circle(0.5)
outside_vertices = make_circle(1.0)
codes = np.ones(
    len(inside_vertices), dtype=mpath.Path.code_type) * mpath.Path.LINETO
codes[0] = mpath.Path.MOVETO

for i, (inside, outside) in enumerate(((1, 1), (1, -1), (-1, 1), (-1, -1))):
    ## Concatenate the inside and outside subpaths together, changing their
    ## order as needed
    vertices = np.concatenate((outside_vertices[::outside],
                               inside_vertices[::inside]))
    ## Shift the path
    vertices[:, 0] += i * 2.5
    ## The codes will be all "LINETO" commands, except for "MOVETO"s at the
    ## beginning of each subpath
    all_codes = np.concatenate((codes, codes))
    ## Create the Path object
    path = mpath.Path(vertices, all_codes)
    ## Add plot it
    patch = mpatches.PathPatch(path, facecolor='#885500', edgecolor='black')
    ax.add_patch(patch)

    ax.annotate(f"Outside {wise(outside)},\nInside {wise(inside)}",
                (i * 2.5, -1.5), va="top", ha="center")

ax.set_xlim(-2, 10)
ax.set_ylim(-3, 2)
ax.set_title('Mmm, donuts!')
ax.set_aspect(1.0)
plt.show()

Resumo

Neste tutorial, aprendemos como criar um donut usando ~.path.Path e ~.patches.PathPatch do Matplotlib. Usamos a função make_circle() para criar o círculo e concatenamos os subcaminhos interno e externo para criar o donut. Também aprendemos como especificar o tipo de cada vértice e criar um objeto Path usando mpath.Path. Finalmente, aprendemos como criar um objeto PathPatch usando mpatches.PathPatch e adicioná-lo ao objeto Axes usando ax.add_patch().

Resumo

Parabéns! Você concluiu o laboratório Criando Donuts Usando ~.path.Path e ~.patches.PathPatch. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.