stackplot
When using matplotlib, the stackplot
function will allow you to create a stacked area plot in Python. The function has two ways to input data, the fist one is stackplot(x, y)
, being x
an array for the values for the X-axis and y
a multidimensional array representing the unstacked values for the series and the second one is stackplot(x, y1, y2, ..., yn)
where in this case y1, y2, ..., yn
are the individual unstacked arrays for each series, being n
the number of series or areas. See the example below for clarification.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y)
# Equivalent to:
# ax.stackplot(x, series1, series2, series3)
# plt.show()
Axis limits
You might have noticed that there is a gap between the areas and the vertical lines of the box of the plot. If you want, you can set the axis limits with the following line to remove the gaps.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y)
# Set the X-axis ticks and limits
ax.set(xlim = (min(x), max(x)), xticks = x)
plt.show()
Adding a legend
Note that the stackplot
function provides an argument named labels
. You can pass an array of labels for each area to this argument in case you want to add a legend to the chart with ax.legend
.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y, labels = ["G1", "G2", "G3"])
ax.legend(loc = 'upper left')
# Axis limits
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
Color customization
The colors
argument can be used to modify the default color palette of the area chart. You can pass as many colors as areas to this argument, as in the example below. Recall that the transparency of the areas can be set with alpha
.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Array of colors
cols = ['#FDF5E6', '#FFEBCD', '#DEB887']
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y, labels = ["G1", "G2", "G3"],
colors = cols, alpha = 0.9)
# Legend
ax.legend(loc = 'upper left')
# Axis limits
ax.set(xlim = (min(x), max(x)), xticks = x)
plt.show()
The stackplot
function provides several methods to customize the baseline. By default, the baseline is zero, e.g. baseline = 'zero'
.
Symmetric stacked area plot around zero (ThemeRiver)
Setting baseline = 'sym'
will create a symmetric stacked area chart around zero. This is sometimes called “ThemeRiver”.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'sym')
# Axis limits
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
Wiggle
The 'wiggle'
baseline minimizes the sum of the squared slopes.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'wiggle')
# Axis limits
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
weighted_wiggle (streamgraph)
Finally, the 'weighted_wiggle'
baseline method is the same as 'wiggle'
but it takes into account the size of each area. This type of chart is also called streamgraph or streamplot.
import numpy as np
import matplotlib.pyplot as plt
# Data
x = np.arange(2015, 2021, 1)
series1 = [2, 3, 5, 3, 5, 6]
series2 = [1, 3, 5, 2, 5, 3]
series3 = [4, 1, 2, 4, 6, 1]
y = np.vstack([series1, series2, series3])
# Stacked area plot
fig, ax = plt.subplots()
ax.stackplot(x, y, baseline = 'weighted_wiggle')
# Axis limits
ax.set(xlim = (min(x), max(x)), xticks = x)
# plt.show()
See also