Libraries & Data
Let's start by loading a few libraries and create a simple dataset:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame(
{
"x": range(1, 6),
"y1": [10, 4, 6, 5, 3],
"y2": [12, 2, 7, 10, 1],
"y3": [8, 18, 5, 7, 6],
}
)
df.head()
x | y1 | y2 | y3 | |
---|---|---|---|---|
0 | 1 | 10 | 12 | 8 |
1 | 2 | 4 | 2 | 18 |
2 | 3 | 6 | 7 | 5 |
3 | 4 | 5 | 10 | 7 |
4 | 5 | 3 | 1 | 6 |
Basic color customization
The easiest way to customize the colors of your chart is to pass to the colors
argument a list of colors:
fig, ax = plt.subplots(figsize=(10, 10), dpi=300)
ax.stackplot(
df["x"],
df["y1"],
df["y2"],
df["y3"],
colors=["#00496FFF", "#0F85A0FF", "#EDD746FF"],
)
plt.show()
Linewidth style
The edgecolor
argument sets the color of the area borders, while linewidth
determines how thick those borders are.
fig, ax = plt.subplots(figsize=(10, 10), dpi=300)
ax.stackplot(
df["x"],
df["y1"],
df["y2"],
df["y3"],
edgecolor="black",
linewidth=3,
colors=["#00496FFF", "#0F85A0FF", "#EDD746FF"],
)
plt.show()
Opacity
We can easily change the opacity of the chart thanks to the alpha
argument. Possible values range from 0
(completely transparent) to 1
(completely opaque), and the default one is 1
:
fig, ax = plt.subplots(figsize=(10, 10), dpi=300)
ax.stackplot(
df["x"],
df["y1"],
df["y2"],
df["y3"],
edgecolor="black",
linewidth=3,
alpha=0.6,
colors=["#00496FFF", "#0F85A0FF", "#EDD746FF"],
)
plt.show()
Pattern inside the areas
fig, ax = plt.subplots(figsize=(10, 10), dpi=300)
ax.stackplot(
df["x"],
df["y1"],
df["y2"],
df["y3"],
edgecolor="black",
linewidth=3,
colors=["#00496FFF", "#0F85A0FF", "#EDD746FF"],
hatch=["*", ".", "+"],
)
plt.show()
More colors with PyPalettes
Thanks to the pypalettes library, it's super easy to use a large number of palette in your seaborn/matplotlib charts. You can find your dream palette in the color palette finder, and use the load_cmap()
function with the name of the palette you want and then access the colors
attribute. Here is an example with the Acadia
palette:
from pypalettes import load_cmap
colors = load_cmap("Acadia").colors
fig, ax = plt.subplots(figsize=(10, 10), dpi=300)
ax.stackplot(
df["x"], df["y1"], df["y2"], df["y3"], edgecolor="black", linewidth=2, colors=colors
)
plt.show()
Going further
You might be interested in:
- what are the other options when building a staked area chart?
- how to smooth a stacked area chart
- how to create a small multiple area chart