Note
Go to the end to download the full example code.
Volume non-orthogonal slicing animation#
Perform non-orthogonal slicing of image volumes.
For an example with UI sliders see the “Volume modes” example.

/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pygfx/objects/_ruler.py:400: RuntimeWarning: divide by zero encountered in divide
screen_full = (ndc_full[:, :2] / ndc_full[:, 3:4]) * half_canvas_size
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pygfx/objects/_ruler.py:400: RuntimeWarning: invalid value encountered in divide
screen_full = (ndc_full[:, :2] / ndc_full[:, 3:4]) * half_canvas_size
/opt/hostedtoolcache/Python/3.12.11/x64/lib/python3.12/site-packages/pygfx/objects/_ruler.py:412: RuntimeWarning: invalid value encountered in divide
screen_sel = (ndc_sel[:, :2] / ndc_sel[:, 3:4]) * half_canvas_size
# test_example = false
import numpy as np
import fastplotlib as fpl
import imageio.v3 as iio
voldata = iio.imread("imageio:stent.npz").astype(np.float32)
figure = fpl.Figure(
cameras="3d",
controller_types="orbit",
size=(700, 560)
)
vol = figure[0, 0].add_image_volume(voldata, mode="slice")
# a plane is defined by ax + by + cz + d = 0
# the plane property sets (a, b, c, d)
vol.plane = (0, 0.5, 0.5, -20)
# just a pre-saved camera state to view the plot area
state = {
"position": np.array([-110.0, 160.0, 240.0]),
"rotation": np.array([-0.25, -0.5, -0.15, 0.85]),
"scale": np.array([1., 1., 1.]),
"reference_up": np.array([0., 1., 0.]),
"fov": 50.0,
"width": 128.0,
"height": 128.0,
"depth": 315,
"zoom": 0.75,
"maintain_aspect": True,
"depth_range": None
}
def update():
# increase d by 1
vol.plane = (0, 0.5, 0.5, vol.plane[-1] - 1)
if vol.plane[-1] < -200:
vol.plane = (0, 0.5, 0.5, -20)
figure[0, 0].add_animations(update)
figure.show()
figure[0, 0].camera.set_state(state)
# NOTE: fpl.loop.run() should not be used for interactive sessions
# See the "JupyterLab and IPython" section in the user guide
if __name__ == "__main__":
print(__doc__)
fpl.loop.run()
Total running time of the script: (0 minutes 15.003 seconds)