Visualizing MRI volume slices with Plotly in Python

Data visualization is one of the highlights of data analysis as it involves a graphical representation of data to help extract insights and patterns simply from raw data. We can enhance our ability to interpret data-driven findings greatly!

Utilizing Plotly's dynamic capabilities, we can now transform raw data into highly interactive plots which are seamless in rendering.

Data visualization can be immensely crucial and useful in the field of medicine, and this answer effectively shows how we can utilize data visualization in MRI analysis.

Data visualization examples
Data visualization examples

Plotly

Plotly is a data visualization library that allows us to create rich and dynamic visualizations in Python, R, and JavaScript. We can create plots ranging from line graphs and bar charts to maps and 3D visualizations. Some interesting features of Plotly include the following:

  1. zooming

  2. panning

  3. tooltips

  4. rotating

  5. downloading plots

Plotly logo
Plotly logo

Magnetic resonance imaging

Magnetic resonance imaging (MRI) is a widely used medical imaging technique thaallows us to capture detailed images of the internal structures of our human body.

Visualizing MRI data can help us detect the following.

  • Anatomical structures

  • Tissue composition

  • Potential abnormalities

Today we'll be visualizing MRI volume slices using Plotly. Basically, we will showcase how to create an animation that reveals MRI slices layer by layer. This can really enhance our understanding of the underlying data.

MRI images
MRI images

Code walkthrough

Importing and processing data

Our first step is to import the MRI data and prepare it for visualization. For this, we can use numpy to handle numerical operations and scikit-image to load our MRI data.

import numpy as np
from skimage import io
vol = io.imread("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/attention-mri.tif")
volume = vol.T
r, c = volume[0].shape

Creating the frames

In Plotly, animations are constructed using frames that capture different states of the needed visualization. We create frames representing each MRI slice for our MRI volume visualization.

We utilize the go.Frame class from Plotly's graph_objects module to define each frame.

import plotly.graph_objects as go
nb_frames = 68
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)
)
for k in range(nb_frames)
]

Setting the initial frame

Before delving into animation, we set the initial frame for the visualization. This initial frame displays the base MRI slice with grayscale coloring.

initial_frame = 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)
)

Constructing the visualization

Now, we bring together our frames and the initial frame to create the complete MRI volume visualization. For this purpose, we create a figure using go.Figure and pass the frames and initial_frame to it.

We also define the layout, including the title and axis settings.

fig = go.Figure(
frames=frames,
data=[initial_frame],
layout=go.Layout(
title='MRI slices',
width=550,
height=550,
scene=dict(
zaxis=dict(range=[-0.1, 6.8], autorange=False),
aspectratio=dict(x=1, y=1, z=1)
)
)
)

Animating the slices

Finally, we can bring our data to life using animations! We configure animation settings and define sliders to interactively explore the MRI slices. The frames are configured with a transition having a duration of 50ms and they ease into each other in a linear manner.

animation_settings = {
"frame": {"duration": 50},
"mode": "immediate",
"transition": {"duration": 50, "easing": "linear"}
}
fig.update_layout(
sliders=[{
"steps": [{
"args": [[frame.name], animation_settings],
"label": str(k),
"method": "animate"
} for k, frame in enumerate(fig.frames)]
}]
)

Displaying the plot

With all components in place, we can call the show() method on our Plotly figure.

fig.show()

Executable code

The following code is completely executable and renders the interactive MRI animation for us and even saves it in an HTML file called output.html. You can experiment with it and click "Run" once done.

import numpy as np
from skimage import io

vol = io.imread("https://s3.amazonaws.com/assets.datacamp.com/blog_assets/attention-mri.tif")
volume = vol.T
r, c = volume[0].shape

import plotly.graph_objects as go

nb_frames = 68

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)
    )
    for k in range(nb_frames)
]

initial_frame = 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)

)

fig = go.Figure(

    frames=frames,
    data=[initial_frame],
    layout=go.Layout(
        title='MRI slices',

        width=550,
        height=550,
        
        scene=dict(
            zaxis=dict(range=[-0.1, 6.8], autorange=False),
            aspectratio=dict(x=1, y=1, z=1)
        )
    )
)

animation_settings = {

    "frame": {"duration": 50},
    "mode": "immediate",
    "transition": {"duration": 50, "easing": "linear"}

}

fig.update_layout(

    sliders=[{
        "steps": [{
            "args": [[frame.name], animation_settings],
            "label": str(k),
            "method": "animate"
        } for k, frame in enumerate(fig.frames)]
    }]
    
)

fig.show()
fig.write_html("output.html", auto_open=True)

Demonstration

Let's see a few different orientations of the MRI slices visualization.

Different orientations of the plot
Different orientations of the plot

Here is an interactive depiction of the code as well! Apart from the animation, we can also use the slider to view a certain slice in the dataset.

Use cases of visualizing MRI volume slices

Such an application where we can demonstrate the visualization of MRI volume slices can help the medicine and health domains.

Use cases

Explanations

Medical diagnosis

MRI volume slices help doctors identify abnormalities, such as tumors or lesions and helps them diagnose such issues timely

Surgical planning

Surgeons can use MRI slices to visualize anatomical structures and reduce risks during complex surgeries

Neuroimaging research

Researches can better analyze MRI data and study brain structures and neurological disorders

End notes

Through Plotly's advanced features, we've created an animation that brings MRI data to life. Therefore, we were able to analyze MRI data and enhance our understanding of medical imaging.

Question

What type of transition did the MRI visualization follow in our code?

Show Answer

Free Resources

Copyright ©2026 Educative, Inc. All rights reserved