Триконтурная сглаженная Делонева

PythonPythonBeginner
Практиковаться сейчас

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

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом руководстве показано, как генерировать высокоразмерные трехмерные графики с использованием Matplotlib. Триангуляция - это метод представления данных на неструктурированной треугольной сетке. Он часто используется, когда данные собираются в точках с нерегулярным интервалом или когда данные по своей природе имеют треугольную форму. Руководство покажет, как сгенерировать случайный набор точек, выполнить Делонева триангуляцию этих точек, скрыть некоторые треугольники в сетке, уточнить и интерполировать данные и, наконец, построить уточненные данные с использованием функции tricontour Matplotlib.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы столкнетесь с проблемами при обучении, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Импортировать необходимые библиотеки

Первым шагом является импорт необходимых библиотек. В этом руководстве будут использоваться NumPy и Matplotlib.

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

Определить тестовую функцию

Далее мы определяем функцию, которая представляет результаты эксперимента. Эта функция будет использоваться для генерации тестовых точек данных.

def experiment_res(x, y):
    """An analytic function representing experiment results."""
    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))

Генерировать тестовые точки данных

Мы генерируем набор случайных тестовых точек данных, с значениями x и y в диапазоне от -1 до 1. Мы также генерируем соответствующий набор значений z с использованием функции experiment_res, определенной на шаге 2.

## User parameters for data test points

## Number of test data points, tested from 3 to 5000 for subdiv=3
n_test = 200

## Random points
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)

Выполнить Делонева триангуляцию

Мы выполняем Делонева триангуляцию по тестовым точкам данных с использованием функции Triangulation из модуля matplotlib.tri.

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

Скрыть некоторые треугольники

Мы скрываем некоторые треугольники в сетке, чтобы имитировать недействительные данные. Мы случайным образом выбираем подмножество треугольников на основе параметра 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)

Улучшить триангуляцию

Мы используем TriAnalyzer, чтобы улучшить триангуляцию, удаляя плохо сформированные (плоские) треугольники из границы триангуляции. Затем мы применяем маску к триангуляции с использованием 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)

Уточнить и интерполировать данные

Мы уточняем и интерполируем данные с использованием UniformTriRefiner.

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

Построить график данных

Мы строим график уточненных данных с использованием функции tricontour из 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()

Резюме

В этом руководстве показано, как генерировать высокоразрешённые графики с помощью функции tricontour из Matplotlib. Мы начали с генерации набора случайных тестовых точек данных, выполнили Делонево триангуляцию этих точек, скрыли некоторые треугольники в сетке, уточнили и интерполировали данные, и в конце концов построили график уточненных данных с использованием функции tricontour из Matplotlib.