matplotlib how to fill_between step function
Categories:
Filling Between Step Functions in Matplotlib

Learn how to effectively use fill_between
with step functions in Matplotlib to create clear and informative visualizations of discrete data ranges.
Matplotlib's fill_between
function is a powerful tool for highlighting regions between two curves or a curve and a horizontal line. While straightforward for continuous data, applying it to step functions requires careful consideration of the step
parameter to ensure accurate visual representation. This article will guide you through the nuances of using fill_between
with step functions, covering different step
arguments and their implications.
Understanding fill_between
with Step Functions
When plotting step functions, the step
parameter in plt.plot
(and consequently plt.fill_between
) dictates how the steps are drawn. The three main options are 'pre'
, 'post'
, and 'mid'
. Each of these affects how the x-values align with the y-values and, crucially, how the filled area is calculated.
graph TD A[Start] --> B{Choose Step Type} B --> |'pre'| C[Y-value changes BEFORE X-value] B --> |'post'| D[Y-value changes AFTER X-value] B --> |'mid'| E[Y-value changes AT X-value midpoint] C --> F[fill_between aligns with 'pre' steps] D --> G[fill_between aligns with 'post' steps] E --> H[fill_between aligns with 'mid' steps] F --> I[Visualize Filled Step Function] G --> I H --> I
Flowchart illustrating the impact of different step
parameters on fill_between
.
Using step='pre'
The 'pre'
step type means that the y-value changes before the x-value. In other words, the y-value at x[i]
is maintained from x[i-1]
to x[i]
. When using fill_between
with 'pre'
, it's often best to also specify step='pre'
to ensure the filled area correctly matches the visual steps. This is particularly useful for visualizing data where a value holds constant until a specific point, then immediately changes.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1, 2, 1, 3, 2, 4])
plt.figure(figsize=(8, 4))
plt.step(x, y, where='pre', label='Step (pre)', color='blue')
plt.fill_between(x, y, step='pre', alpha=0.3, color='lightblue')
plt.title("fill_between with step='pre'")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.legend()
plt.grid(True)
plt.show()
Example of fill_between
with step='pre'
.
Using step='post'
With step='post'
, the y-value changes after the x-value. This means the y-value at x[i]
is maintained from x[i]
to x[i+1]
. This is a common way to represent discrete events or changes that occur at a specific point and then persist. When filling, using step='post'
in fill_between
will align the filled area with these post-step changes.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1, 2, 1, 3, 2, 4])
plt.figure(figsize=(8, 4))
plt.step(x, y, where='post', label='Step (post)', color='green')
plt.fill_between(x, y, step='post', alpha=0.3, color='lightgreen')
plt.title("fill_between with step='post'")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.legend()
plt.grid(True)
plt.show()
Example of fill_between
with step='post'
.
Using step='mid'
The 'mid'
step type places the y-value change exactly at the x-value. The y-value at x[i]
is centered around x[i]
, extending halfway to x[i-1]
and halfway to x[i+1]
. This can be useful for representing data points that are averages or measurements taken at specific intervals. When using fill_between
with 'mid'
, the filled area will be centered around the x-values.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y = np.array([1, 2, 1, 3, 2, 4])
plt.figure(figsize=(8, 4))
plt.step(x, y, where='mid', label='Step (mid)', color='red')
plt.fill_between(x, y, step='mid', alpha=0.3, color='salmon')
plt.title("fill_between with step='mid'")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.legend()
plt.grid(True)
plt.show()
Example of fill_between
with step='mid'
.
step
parameter in plt.fill_between
matches the where
parameter used in plt.step
(or the implicit step behavior if not explicitly set). Mismatched step
values can lead to visually incorrect filled areas.Filling Between Two Step Functions
You can also fill the area between two different step functions. This is useful for visualizing a range or a confidence interval around a step-wise measurement. The principle remains the same: ensure the step
parameter is consistent across both y1
and y2
arguments of fill_between
.
import matplotlib.pyplot as plt
import numpy as np
x = np.array([0, 1, 2, 3, 4, 5])
y1 = np.array([1, 2, 1, 3, 2, 4])
y2 = np.array([0.5, 1.5, 0.5, 2.5, 1.5, 3.5]) # A lower step function
plt.figure(figsize=(8, 4))
plt.step(x, y1, where='post', label='Upper Step', color='purple')
plt.step(x, y2, where='post', label='Lower Step', color='orange')
plt.fill_between(x, y1, y2, step='post', alpha=0.3, color='grey', label='Filled Area')
plt.title("fill_between between two step functions (post)")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.legend()
plt.grid(True)
plt.show()
Filling the area between two step functions using step='post'
.
y1
and y2
should ideally have the same step
behavior to ensure the filled region accurately reflects the area between them. If their step behaviors differ, the visual result might be unexpected.