Tricontorno Suave de Delaunay

Beginner

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

Introdução

Este tutorial demonstra como gerar gráficos de tricontorno de alta resolução com Matplotlib. Tricontorno (tricontouring) é uma técnica utilizada para representar dados em uma malha triangular não estruturada. É frequentemente utilizada quando os dados são coletados em pontos espaçados irregularmente, ou quando os dados são inerentemente triangulares por natureza. O tutorial mostrará como gerar um conjunto aleatório de pontos, realizar uma triangulação de Delaunay nesses pontos, mascarar alguns dos triângulos na malha, refinar e interpolar os dados e, finalmente, plotar os dados refinados usando a função tricontour 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ê.

Importar as Bibliotecas Necessárias

O primeiro passo é importar as bibliotecas necessárias. Este tutorial usará NumPy e Matplotlib.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.tri import TriAnalyzer, Triangulation, UniformTriRefiner

Definir a Função de Teste

Em seguida, definimos uma função que representa os resultados de um experimento. Esta função será usada para gerar os pontos de dados de teste.

def experiment_res(x, y):
    """Uma função analítica que representa os resultados do experimento."""
    x = 2 * x
    r1 = np.sqrt((0.5 - x)**2 + (0.5 - y)**2)
    theta1 = np.arctan2(0.5 - x, 0.5 - y)
    r2 = np.sqrt((-x - 0.2)**2 + (-y - 0.2)**2)
    theta2 = np.arctan2(-x - 0.2, -y - 0.2)
    z = (4 * (np.exp((r1/10)**2) - 1) * 30 * np.cos(3 * theta1) +
         (np.exp((r2/10)**2) - 1) * 30 * np.cos(5 * theta2) +
         2 * (x**2 + y**2))
    return (np.max(z) - z) / (np.max(z) - np.min(z))

Gerar Pontos de Dados de Teste

Geramos um conjunto de pontos de dados de teste aleatórios, com valores x e y entre -1 e 1. Também geramos um conjunto correspondente de valores z usando a função experiment_res definida no passo 2.

## Parâmetros do usuário para pontos de dados de teste

## Número de pontos de dados de teste, testado de 3 a 5000 para subdiv=3
n_test = 200

## Pontos aleatórios
random_gen = np.random.RandomState(seed=19680801)
x_test = random_gen.uniform(-1., 1., size=n_test)
y_test = random_gen.uniform(-1., 1., size=n_test)
z_test = experiment_res(x_test, y_test)

Realizar a Triangulação de Delaunay

Realizamos uma triangulação de Delaunay nos pontos de dados de teste usando a função Triangulation do módulo matplotlib.tri.

## meshing with Delaunay triangulation
tri = Triangulation(x_test, y_test)
ntri = tri.triangles.shape[0]

Mascar Alguns Triângulos

Nós mascaramos alguns dos triângulos na malha para simular dados inválidos. Selecionamos aleatoriamente um subconjunto de triângulos com base no parâmetro init_mask_frac.

## Some invalid data are masked out
mask_init = np.zeros(ntri, dtype=bool)
masked_tri = random_gen.randint(0, ntri, int(ntri * init_mask_frac))
mask_init[masked_tri] = True
tri.set_mask(mask_init)

Melhorar a Triangulação

Usamos um TriAnalyzer para melhorar a triangulação, removendo triângulos mal formados (planos) da borda da triangulação. Em seguida, aplicamos a máscara à triangulação usando set_mask.

## masking badly shaped triangles at the border of the triangular mesh.
mask = TriAnalyzer(tri).get_flat_tri_mask(min_circle_ratio)
tri.set_mask(mask)

Refinar e Interpolar Dados

Nós refinamos e interpolamos os dados usando um UniformTriRefiner.

## refining the data
refiner = UniformTriRefiner(tri)
tri_refi, z_test_refi = refiner.refine_field(z_test, subdiv=subdiv)

Plotar os Dados

Nós plotamos os dados refinados usando a função tricontour do Matplotlib.

## Graphical options for tricontouring
levels = np.arange(0., 1., 0.025)

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.set_title("Filtering a Delaunay mesh\n"
             "(application to high-resolution tricontouring)")

## plot of the refined (computed) data contours:
ax.tricontour(tri_refi, z_test_refi, levels=levels, cmap='Blues',
              linewidths=[2.0, 0.5, 1.0, 0.5])

plt.show()

Resumo

Este tutorial demonstrou como gerar gráficos de tricontorno de alta resolução com Matplotlib. Começamos gerando um conjunto de pontos de dados de teste aleatórios, realizando uma triangulação de Delaunay nesses pontos, mascarando alguns dos triângulos na malha, refinando e interpolando os dados e, finalmente, plotando os dados refinados usando a função tricontour do Matplotlib.