Animated Scatter Plots in Plotly for Time-Series Data
Time-series data consists of observations collected at regular intervals over time, often used in fields such as finance, meteorology, and economics. One powerful way to visualize this type of data is through animated scatter plots, which not only display the data points but also reveal changes and trends over time in a dynamic and engaging manner.
Plotly is a popular Python library that allows users to create interactive plots easily. Its capabilities extend beyond static visualizations, enabling the creation of animations that can illustrate complex datasets. This article will guide you through the process of creating animated scatter plots in Plotly using a sample time-series dataset.
Table of Content
Creating the Animated Scatter Plot
Let’s create a synthetic dataset that we will use for our animated scatter plot. We will generate random sales data for three different product categories over a span of two years. Here’s how you can do this:
Now that we have our dataset ready, let’s create the animated scatter plot using Plotly. We will utilize the plotly.express module, which provides a high-level interface for creating plots quickly.
import pandas as pd
import numpy as np
# Set the random seed for reproducibility
np.random.seed(42)
# Create a date range
date_range = pd.date_range(start='2022-01-01', end='2023-12-01', freq='MS')
# Create a synthetic dataset
data = {
'date': date_range,
'sales': np.random.randint(100, 1000, size=len(date_range)),
'profit': np.random.randint(10, 300, size=len(date_range)), # New profit column
'category': np.random.choice(['A', 'B', 'C'], size=len(date_range))
}
df = pd.DataFrame(data)
# Display the first few rows of the dataset
print(df.head())
Output:
date sales category
0 2022-01-01 202 B
1 2022-02-01 535 B
2 2022-03-01 960 B
3 2022-04-01 370 A
4 2022-05-01 206 A
Now that we have our dataset ready, let’s create the animated scatter plot using Plotly. We will utilize the plotly.express module, which provides a high-level interface for creating plots quickly. Few parameters in the code:
- Size Parameter: The size='profit' argument uses the profit value to determine the size of the markers. Larger profits will correspond to larger markers, adding another layer of information to the visualization.
- Hover Data: The hover_data parameter allows us to include multiple fields in the hover tooltip, enhancing user interactivity. Here, we can see both profit and sales amounts when hovering over the points.
- Custom Template: We switched to the plotly_white template for a cleaner look, but you can customize this further to suit your needs.
- Annotations: We included annotations for significant points in the time series to provide additional context for specific events.
import plotly.express as px
# Create an animated scatter plot with additional features
fig = px.scatter(
df,
x='date',
y='sales',
animation_frame='date',
color='category',
size='profit', # Use profit for marker size
title='Monthly Sales and Profit Data (Animated Scatter Plot)',
labels={'sales': 'Sales Amount', 'date': 'Date'},
range_y=[0, 1000],
range_x=[df['date'].min(), df['date'].max()], # Ensure x-axis covers the full date range
hover_name='category', # Show category on hover
hover_data={'profit': True, 'sales': True}, # Include profit in hover data
template='plotly_white' # Change the template for a different aesthetic
)
# Customize layout for better aesthetics
fig.update_layout(
title_x=0.5, # Center the title
xaxis_title='Date',
yaxis_title='Sales Amount',
legend_title='Product Category',
hovermode='closest',
showlegend=True
)
# Add annotations for significant points if needed
annotations = [
dict(x='2022-06-01', y=600, text='Mid Year Peak', showarrow=True, arrowhead=2, ax=0, ay=-40),
dict(x='2023-12-01', y=800, text='End of Year Surge', showarrow=True, arrowhead=2, ax=0, ay=-40)
]
fig.update_layout(annotations=annotations)
# Show the plot
fig.show()
Output:


Animated Scatter Plots with Plotly Express : Examples
Plotly Express is a high-level interface that simplifies the creation of visualizations. It is particularly useful for quick and easy plotting.
Example 1: Animated Scatter Plot Using Gapminder Dataset
The Gapminder dataset is a popular dataset used for demonstrating animated plots. It contains information about countries' GDP per capita, life expectancy, and population over several years. Key Parameters
- animation_frame: Specifies the column representing time or frames.
- animation_group: Groups data points by a specific category (e.g., country).
- size: Adjusts the size of markers based on a variable (e.g., population).
- color: Colors markers based on a categorical variable (e.g., continent).
# Load Gapminder dataset
df = px.data.gapminder()
# Create an animated scatter plot
fig = px.scatter(
df,
x="gdpPercap",
y="lifeExp",
animation_frame="year",
animation_group="country",
size="pop",
color="continent",
hover_name="country",
log_x=True,
size_max=55,
range_x=[100, 100000],
range_y=[25, 90]
)
# Show the plot
fig.show()
Output:


Example 2: Creating an Animated Scatter Plot with Graph Objects
For more control over animations, you can use Plotly Graph Objects. This approach provides greater flexibility but requires more detailed configuration. Customizing Animations:
- Frames: Define each frame of the animation using go.Frame.
- Layout: Customize layout properties such as axis ranges and titles.
- Buttons: Add play/pause buttons for controlling animation.
import plotly.graph_objects as go
import numpy as np
# Generate sample data
t = np.linspace(0, 10, 100)
x = np.sin(t)
y = np.cos(t)
# Create figure
fig = go.Figure(
data=[go.Scatter(x=x, y=y, mode='markers')],
layout=go.Layout(
xaxis=dict(range=[-1.5, 1.5]),
yaxis=dict(range=[-1.5, 1.5]),
title="Animated Scatter Plot",
updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None])])]
),
frames=[go.Frame(data=[go.Scatter(x=x[:k], y=y[:k], mode='markers')]) for k in range(1, len(x))]
)
# Show the plot
fig.show()
Output:


Best Practices for Animated Scatter Plots
- Fix Axis Ranges: Ensure consistent axis ranges to prevent shifting during animation.
- Optimize Performance: Use efficient data structures and limit the number of frames for large datasets.
- Enhance Interactivity: Add hover text and tooltips for additional information.
Conclusion
Animated scatter plots in Plotly provide a powerful tool for visualizing time-series data dynamically. Whether using Plotly Express for quick plotting or Graph Objects for detailed customization, these animations can enhance your data storytelling capabilities.