Matplotlib Tricontour Suave para Usuários

Beginner

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

Introdução

Este laboratório irá guiá-lo através do processo de criação de tricontornos de alta resolução em grades triangulares definidas pelo usuário usando Matplotlib. Você aprenderá como criar uma Triangulação (Triangulation), refinar dados e plotar a triangulação e iso-contornos de alta resolução.

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

Função de Teste Analítica

Nesta etapa, definimos uma função de teste analítica que será usada para gerar valores z para a triangulação. A função é chamada function_z e recebe dois argumentos, x e y. Ela calcula z com base nos valores de x e y, e retorna os valores z normalizados.

def function_z(x, y):
    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 = -(2 * (np.exp((r1 / 10)**2) - 1) * 30. * np.cos(7. * theta1) +
          (np.exp((r2 / 10)**2) - 1) * 30. * np.cos(11. * theta2) +
          0.7 * (x**2 + y**2))
    return (np.max(z) - z) / (np.max(z) - np.min(z))

Criando uma Triangulação (Triangulation)

Nesta etapa, criamos as coordenadas x e y dos pontos usando np.linspace e np.repeat. Em seguida, usamos a function_z definida na Etapa 1 para calcular os valores z. Finalmente, criamos a Triangulação usando tri.Triangulation.

n_angles = 20
n_radii = 10
min_radius = 0.15
radii = np.linspace(min_radius, 0.95, n_radii)

angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)
angles[:, 1::2] += np.pi / n_angles

x = (radii * np.cos(angles)).flatten()
y = (radii * np.sin(angles)).flatten()
z = function_z(x, y)

triang = tri.Triangulation(x, y)
triang.set_mask(np.hypot(x[triang.triangles].mean(axis=1),
                         y[triang.triangles].mean(axis=1))
                < min_radius)

Refinar Dados (Refine Data)

Nesta etapa, usamos tri.UniformTriRefiner para refinar os dados. Usamos o método refine_field para refinar os valores z e criar uma nova Triangulação com maior resolução.

refiner = tri.UniformTriRefiner(triang)
tri_refi, z_test_refi = refiner.refine_field(z, subdiv=3)

Plotar Triangulação e Iso-contornos de Alta Resolução (High-resolution Iso-contours)

Nesta etapa, plotamos a Triangulação e os iso-contornos de alta resolução usando ax.triplot, ax.tricontourf e ax.tricontour.

fig, ax = plt.subplots()
ax.set_aspect('equal')
ax.triplot(triang, lw=0.5, color='white')

levels = np.arange(0., 1., 0.025)
ax.tricontourf(tri_refi, z_test_refi, levels=levels, cmap='terrain')
ax.tricontour(tri_refi, z_test_refi, levels=levels,
              colors=['0.25', '0.5', '0.5', '0.5', '0.5'],
              linewidths=[1.0, 0.5, 0.5, 0.5, 0.5])

ax.set_title("Tricontouring de alta resolução")

plt.show()

Resumo (Summary)

Neste laboratório, você aprendeu como criar tricontornos de alta resolução em grades triangulares definidas pelo usuário usando Matplotlib. Você aprendeu como criar uma Triangulação, refinar dados e plotar a triangulação e os iso-contornos de alta resolução.