Skip to content

Stacking Layers

If a quantity can be cumulatively added, stacking is a great way to visualize the total amount of each data point. In this section, we will use the following data.

df = {
    "day": [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3],
    "value": [1, 5, 10, 20, 2, 6, 8, 15, 3, 6, 9, 12],
    "person": ["A"] * 4 + ["B"] * 4 + ["C"] * 4,
}

There are only limited number of plot types that can be stacked. Currently, area plot and bar plot are supported. Methods to add these plots are in the "stacked categorical plotter" object that can be created by the stack method of the categorical plotters.

from whitecanvas import new_canvas

canvas = new_canvas("matplotlib")
(
    canvas
    .cat_x(df, x="day", y="value")
    .stack(by="person")
    .add_area()
)
canvas

Here, the column "person" is used to stack the area plot, which means that the input data is split by the values in the "person" column, and the area plot is drawn for each category. These plots are stacked on top of each other.

Each stack is usually drawn with a different color. You can give the same column name as the color argument to the add_area method.

from whitecanvas import new_canvas

canvas = new_canvas("matplotlib")
(
    canvas
    .cat_x(df, x="day", y="value")
    .stack(by="person")
    .add_area(color="person")
)
canvas

or, of course, drawn with different hatch patterns.

from whitecanvas import new_canvas

canvas = new_canvas("matplotlib")
(
    canvas
    .cat_x(df, x="day", y="value")
    .stack(by="person")
    .add_area(hatch="person")
)
canvas

The "person" column is given to both the stack and the add_area method. In these cases, the argument of stack can be omitted.

from whitecanvas import new_canvas

canvas = new_canvas("matplotlib")
(
    canvas
    .cat_x(df, x="day", y="value")
    .stack()
    .add_area(color="person")
)
canvas

Another way to show the data is to use bar plots.

from whitecanvas import new_canvas

canvas = new_canvas("matplotlib")
(
    canvas
    .cat_x(df, x="day", y="value")
    .stack()
    .add_bars(color="person", extent=0.5)
)
canvas