Open the original notebook on GitHub
Visualization with py3Dmol (optional)
pyvoro2 includes a small optional helper module, pyvoro2.viz3d, for interactive visualization
in notebooks. It is meant for exploration and debugging:
- draw the domain wireframe (box or unit cell),
- draw cell wireframes from the
vertices/facesoutput, - optionally draw labeled sites and (global) vertices.
Install the extra dependency with:
pip install "pyvoro2[viz]"
or directly:
pip install py3Dmol
These helpers are intentionally lightweight. For publication-quality rendering you will usually want a dedicated 3D pipeline.
import numpy as np import pyvoro2 as pv from pyvoro2.viz3d import VizStyle, view_tessellation rng = np.random.default_rng(0)
1) Non-periodic box
In a non-periodic Box, all returned vertices are inside the domain boundary.
points = rng.uniform(-1.0, 1.0, size=(15, 3))
box = pv.Box(((-2, 2), (-2, 2), (-2, 2)))
cells = pv.compute(
points,
domain=box,
return_vertices=True,
return_faces=True,
)
view_tessellation(
cells,
domain=box,
show_vertices=False, # start simple
)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Output
<py3Dmol.view at 0x12777ece710>
2) Styling with VizStyle
All visual parameters (radii, line widths, label sizes, colors) are collected in a small dataclass
VizStyle. You can pass a modified style object to view_tessellation(...).
Below we: - make sites smaller, - make edges thicker, - and show vertex markers.
style = VizStyle(
site_radius=0.06,
edge_line_width=4.0,
vertex_radius=0.03,
site_label_font_size=7,
vertex_label_font_size=6,
)
view_tessellation(
cells,
domain=box,
style=style,
show_vertices=True,
show_vertex_labels='off',
)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Output
<py3Dmol.view at 0x12777eceaa0>
3) Periodic triclinic unit cell: vertices may lie outside the primary cell
In periodic tessellations it is normal for some cell vertices to lie outside the “primary” unit cell. This does not mean the tessellation is wrong: it is a consequence of representing a periodic polyhedron in Cartesian space.
In the next cell we show a random configuration in a tilted triclinic cell.
cell = pv.PeriodicCell(
vectors=((10.0, 0.0, 0.0), (2.0, 9.0, 0.0), (1.0, 0.5, 8.0)),
origin=(0.0, 0.0, 0.0),
)
points_p = rng.random((20, 3)) # arbitrary Cartesian points
cells_p = pv.compute(
points_p,
domain=cell,
return_vertices=True,
return_faces=True,
return_face_shifts=True,
)
view_tessellation(
cells_p,
domain=cell,
show_vertices=False,
)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Output
<py3Dmol.view at 0x12777ecddb0>
4) Wrapping cells for visualization
If wrap_cells=True, each cell geometry is translated by an integer lattice vector so that its
site lies inside the primary unit-cell parallelepiped. This is purely a visualization convenience.
view_tessellation(
cells_p,
domain=cell,
wrap_cells=True,
show_vertices=False,
)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Output
<py3Dmol.view at 0x12777ecfcd0>
5) Global vertex labels via normalize_vertices / normalize_topology
If you normalize vertices/topology, the view can show global vertex ids (`v0`, `v1`, ...). This is useful when you want to compare connectivity across cells or debug periodic graphs.
In periodic tessellations the same global vertex can appear in several periodic images. The label always refers to the global id, while the marker position follows the drawn wireframe geometry for the currently shown cells.
from pyvoro2 import normalize_vertices
nv = normalize_vertices(cells_p, domain=cell)
view_tessellation(
nv,
domain=cell,
wrap_cells=False,
show_vertices=True,
show_vertex_labels='auto', # show labels only when feasible
)
3Dmol.js failed to load for some reason. Please check your browser console for error messages.
Output
<py3Dmol.view at 0x12777ece9e0>
Tips
- For large systems, visualize a subset of cells (
cell_ids={0, 1, 2}) or only sites (show_vertices=False). - If labels clutter the view, disable them (
show_site_labels=False) or reducemax_site_labels. - The visualization helpers accept the outputs of
ghost_cells(...)as well, which is handy for probe analysis.