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.