Source code for pyfracval.visualization

"""Plotting functions using PyVista."""

import numpy as np
import pyvista as pv


[docs] def plot_particles(positions: np.ndarray, radii: np.ndarray) -> pv.Plotter: """Generate a PyVista plot of spheres representing particles. Creates a 3D visualization using sphere glyphs scaled by particle radii. Parameters ---------- positions: Nx3 array of particle center coordinates. radii: N array of particle radii. Returns ------- pyvista.Plotter A PyVista Plotter object configured with the particle mesh. Call `.show()` on the returned object to display interactively. Returns an empty Plotter if input `positions` is empty. """ if positions.shape[0] == 0: print("Warning: Cannot plot empty particle data.") return pv.Plotter() # Return empty plotter point_cloud = pv.PolyData(positions) # Use actual radii for scaling glyphs point_cloud["radius"] = 2 * radii # Create a sphere glyph primitive # Adjust resolution for performance vs quality geom = pv.Sphere(theta_resolution=16, phi_resolution=16) # Apply glyph filter # orient=False is usually fine if spheres are uniform color # tolerance can sometimes help with glyph placement issues if centers are very close glyphed = point_cloud.glyph(scale="radius", geom=geom, orient=False, tolerance=0.0) # Setup plotter pl = pv.Plotter(window_size=[800, 800]) pl.add_mesh( glyphed, color="lightblue", # Or choose another color smooth_shading=True, pbr=True, # Use physically based rendering for better appearance metallic=0.3, roughness=0.5, ) pl.view_isometric() pl.enable_anti_aliasing("fxaa") # Nicer visuals # pl.link_views() # Usually not needed for single view pl.background_color = "white" # Or black, grey etc. return pl