Skip to content

Visualization Tutorial

This tutorial demonstrates how to visualize DDACS simulation results using the built-in visualization utilities.

All examples use simulation 16336.h5 from the dataset for reproducibility.


Point Cloud - Multiple Components

Visualize all components of the deep drawing setup together.

import matplotlib.pyplot as plt
from ddacs.utils import extract_point_cloud
from ddacs.visualization import plot_point_cloud, COMPONENT_COLORS, COMPONENT_NAMES

h5_path = "./data/h5/16336.h5"

fig = plt.figure(figsize=(12, 5))
ax = fig.add_subplot(111, projection="3d")

for component in COMPONENT_COLORS.keys():
    coords = extract_point_cloud(h5_path, component, timestep=2)
    alpha = 0.3 if component == "blank" else 0.7
    plot_point_cloud(
        coords,
        ax=ax,
        c=COMPONENT_COLORS[component],
        s=0.5,
        alpha=alpha,
        axis_limits=[0, 110],
    )
    ax.scatter([], [], [], c=COMPONENT_COLORS[component], label=COMPONENT_NAMES[component])
    print(f"{component}: {coords.shape[0]} nodes")

ax.set_title("Deep Drawing Setup - Simulation 16336")
ax.legend(bbox_to_anchor=(1, 1), loc="upper left", fontsize="small")
plt.savefig("point_cloud.png", dpi=300, bbox_inches="tight", pad_inches=0.3)

Output:

blank: 11041 nodes
die: 1089 nodes
punch: 529 nodes
binder: 168 nodes


Mesh Visualization

Plot the blank mesh with shading for better 3D perception.

from ddacs.utils import extract_mesh
from ddacs.visualization import plot_mesh
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

vertices, triangles = extract_mesh(h5_path, "blank", timestep=2)
print(f"Mesh: {vertices.shape[0]} vertices, {triangles.shape[0]} faces")

ax = plot_mesh(
    vertices, triangles,
    facecolors="red",
    edgecolors="red",
    linewidth=0.3,
    title="Blank Mesh - Simulation 16336",
    figsize=(12, 5),
    axis_limits=[0, 110],
)
plt.savefig("mesh.png", dpi=300, bbox_inches="tight", pad_inches=0.3)

Output:

Mesh: 11041 vertices, 43296 faces


Thickness Distribution

Visualize material thinning during the forming process.

from ddacs.utils import extract_mesh, extract_element_thickness
from ddacs.visualization import plot_mesh
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

vertices, triangles = extract_mesh(h5_path, "blank", timestep=-1)
thickness = extract_element_thickness(h5_path, timestep=-1)
print(f"Thickness range: {thickness.min():.4f} - {thickness.max():.4f} mm")

ax, cbar = plot_mesh(
    vertices, triangles,
    values=thickness,
    cmap="viridis",
    vmin=0.8,
    vmax=1.15,
    colorbar_label="Thickness [mm]",
    title="Thickness Distribution - Simulation 16336",
    figsize=(12, 5),
    axis_limits=[0, 110],
    edgecolors="face",
    linewidth=0.3,
)
plt.savefig("thickness.png", dpi=300, bbox_inches="tight", pad_inches=0.3)

Output:

Thickness range: 0.8734 - 1.0892 mm


Springback Magnitude

Visualize elastic recovery after tool removal.

import numpy as np
from ddacs.utils import extract_point_springback
from ddacs.visualization import plot_point_cloud
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

coords, displacement = extract_point_springback(h5_path, operation=20)
magnitude = np.linalg.norm(displacement, axis=1)
print(f"Springback range: {magnitude.min():.4f} - {magnitude.max():.4f} mm")

ax, cbar = plot_point_cloud(
    coords,
    values=magnitude,
    cmap="plasma",
    vmin=0.0,
    vmax=1.4,
    colorbar_label="Springback [mm]",
    title="Springback Magnitude - Simulation 16336",
    figsize=(12, 5),
    axis_limits=[0, 110],
    s=1,
    alpha=0.8,
)
plt.savefig("springback.png", dpi=300, bbox_inches="tight", pad_inches=0.3)

Output:

Springback range: 0.0000 - 1.2847 mm


Springback Vector Field

Show displacement direction with arrows.

import numpy as np
from ddacs.utils import extract_point_springback
from ddacs.visualization import plot_vectors
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

coords, displacement = extract_point_springback(h5_path, operation=20)
magnitude = np.linalg.norm(displacement, axis=1)

ax, cbar = plot_vectors(
    coords,
    displacement,
    values=magnitude,
    step=25,
    scale=10.0,
    cmap="plasma",
    vmin=0.0,
    vmax=1.4,
    colorbar_label="Springback [mm]",
    title="Springback Vectors - Simulation 16336",
    figsize=(12, 5),
    axis_limits=[0, 110],
    point_kwargs={"s": 1, "alpha": 0.6},
    arrow_kwargs={"color": "red", "alpha": 0.8},
)
plt.savefig("vectors.png", dpi=300, bbox_inches="tight", pad_inches=0.3)


2D Top View Projection

Project springback data onto a 2D plane.

import numpy as np
from ddacs.utils import extract_point_springback
from ddacs.visualization import plot_2d_projection
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

coords, displacement = extract_point_springback(h5_path, operation=20)
magnitude = np.linalg.norm(displacement, axis=1)

ax, cbar = plot_2d_projection(
    coords,
    values=magnitude,
    projection="xy",
    cmap="plasma",
    vmin=0.0,
    vmax=1.4,
    colorbar_label="Springback [mm]",
    title="Springback Top View - Simulation 16336",
    figsize=(12, 5),
    s=2,
    alpha=0.8,
)
plt.savefig("2d_projection.png", dpi=300, bbox_inches="tight", pad_inches=0.3)


Additional Features

Using Existing Axes

import matplotlib.pyplot as plt
from ddacs.utils import extract_mesh
from ddacs.visualization import plot_mesh

h5_path = "./data/h5/16336.h5"

fig = plt.figure(figsize=(12, 5))
ax1 = fig.add_subplot(121, projection="3d")
ax2 = fig.add_subplot(122, projection="3d")

vertices, faces = extract_mesh(h5_path, "blank", timestep=2)
plot_mesh(vertices, faces, ax=ax1, title="OP10 Final", facecolors="blue")

vertices, faces = extract_mesh(h5_path, "blank", timestep=-1, operation=20)
plot_mesh(vertices, faces, ax=ax2, title="OP20 Final", facecolors="red")

plt.tight_layout()
plt.show()

Custom Axis Limits

from ddacs.utils import extract_mesh
from ddacs.visualization import plot_mesh

h5_path = "./data/h5/16336.h5"

vertices, faces = extract_mesh(h5_path, "blank", timestep=2)
ax = plot_mesh(
    vertices, faces,
    axis_limits=[0, 150],
    title="Extended View"
)

Publication-Ready Figures

from ddacs.utils import extract_mesh, extract_element_thickness
from ddacs.visualization import plot_mesh
import matplotlib.pyplot as plt

h5_path = "./data/h5/16336.h5"

vertices, faces = extract_mesh(h5_path, "blank", timestep=-1)
thickness = extract_element_thickness(h5_path, timestep=-1)

ax, cbar = plot_mesh(
    vertices, faces,
    values=thickness,
    figsize=(5, 3.5),
    colorbar_label="Thickness [mm]"
)
plt.savefig("figure.pdf", dpi=300, bbox_inches="tight")

Next Steps