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:

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:

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:

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 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¶
- Explore the API Reference for all options
- See
notebooks/dataset_demo.ipynbfor more advanced examples - Check the Dataset Overview for physics background