Matplotlib Tricontour Smooth User

Beginner

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

Einführung

In diesem Lab werden Sie durch den Prozess des Erstellens von hochauflösenden Triskonturen auf benutzerdefinierten Dreiecksnetzen mit Matplotlib geführt. Sie werden lernen, wie Sie eine Triangulation erstellen, Daten verfeinern und die Triangulation und hochauflösende Iso-Konturen darstellen.

Tipps für die VM

Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.

Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.

Wenn Sie während des Lernens Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.

Analytische Testfunktion

In diesem Schritt definieren wir eine analytische Testfunktion, die verwendet wird, um Z-Werte für die Triangulation zu generieren. Die Funktion heißt function_z und nimmt zwei Argumente, x und y, entgegen. Sie berechnet z basierend auf den Werten von x und y und gibt die normalisierten z-Werte zurück.

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))

Erstellen einer Triangulation

In diesem Schritt erstellen wir die x- und y-Koordinaten der Punkte mit np.linspace und np.repeat. Anschließend verwenden wir die in Schritt 1 definierte function_z, um die z-Werte zu berechnen. Schließlich erstellen wir die Triangulation mit 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)

Daten verfeinern

In diesem Schritt verwenden wir tri.UniformTriRefiner, um die Daten zu verfeinern. Mit der refine_field-Methode verfeinern wir die z-Werte und erstellen eine neue Triangulation mit höherer Auflösung.

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

Triangulation und hochauflösende Iso-Konturen darstellen

In diesem Schritt stellen wir die Triangulation und die hochauflösenden Iso-Konturen mit ax.triplot, ax.tricontourf und ax.tricontour dar.

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("High-resolution tricontouring")

plt.show()

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie mit Matplotlib hochauflösende Iso-Konturen auf benutzerdefinierten Dreiecksgittern erstellen. Sie haben gelernt, wie Sie eine Triangulation erstellen, Daten verfeinern und die Triangulation und die hochauflösenden Iso-Konturen darstellen.