Finn Völkel / Nov 04 2020
Remix of Python by
Nextjournal
Visualization of MRI volume slices
This notebook demonstrates an interactive pyplot animation, more precisely an animation with a slider that cycles through MRI cross-sections of a human brain.
Example taken from https://plotly.com/python/visualizing-mri-volume-slices/.
# Import dataimport timeimport numpy as npfrom skimage import iovol = io.imread("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/attention-mri.tif")volume = vol.Tr, c = volume[0].shape# Define framesimport plotly.graph_objects as gonb_frames = 68fig = go.Figure(frames=[go.Frame(data=go.Surface( z=(6.7 - k * 0.1) * np.ones((r, c)), surfacecolor=np.flipud(volume[67 - k]), cmin=0, cmax=200 ), name=str(k) # you need to name the frame for the animation to behave properly ) for k in range(nb_frames)])# Add data to be displayed before animation startsfig.add_trace(go.Surface( z=6.7 * np.ones((r, c)), surfacecolor=np.flipud(volume[67]), colorscale='Gray', cmin=0, cmax=200, colorbar=dict(thickness=20, ticklen=4) ))def frame_args(duration): return { "frame": {"duration": duration}, "mode": "immediate", "fromcurrent": True, "transition": {"duration": duration, "easing": "linear"}, }sliders = [ { "pad": {"b": 10, "t": 60}, "len": 0.9, "x": 0.1, "y": 0, "steps": [ { "args": [[f.name], frame_args(0)], "label": str(k), "method": "animate", } for k, f in enumerate(fig.frames) ], } ]# Layoutfig.update_layout( title='Slices in volumetric data', width=600, height=600, scene=dict( zaxis=dict(range=[-0.1, 6.8], autorange=False), aspectratio=dict(x=1, y=1, z=1), ), updatemenus = [ { "buttons": [ { "args": [None, frame_args(50)], "label": "▶", # play symbol "method": "animate", }, { "args": [[None], frame_args(0)], "label": "◼", # pause symbol "method": "animate", }, ], "direction": "left", "pad": {"r": 10, "t": 70}, "type": "buttons", "x": 0.1, "y": 0, } ], sliders=sliders)fig42.8s
Python