The Lifecycle of a Plot#

This tutorial aims to show the beginning, middle, and end of a single visualization using Matplotlib. We'll begin with some raw data and end by saving a figure of a customized visualization. Along the way we try to highlight some neat features and best-practices using Matplotlib.

Note

This tutorial is based on this excellent blog post by Chris Moffitt. It was transformed into this tutorial by Chris Holdgraf.

A note on the explicit vs. implicit interfaces#

Matplotlib has two interfaces. For an explanation of the trade-offs between the explicit and implicit interfaces see Matplotlib Application Interfaces (APIs).

In the explicit object-oriented (OO) interface we directly utilize instances of axes.Axes to build up the visualization in an instance of figure.Figure. In the implicit interface, inspired by and modeled on MATLAB, we use a global state-based interface which is encapsulated in the pyplot module to plot to the "current Axes". See the pyplot tutorials for a more in-depth look at the pyplot interface.

Most of the terms are straightforward but the main thing to remember is that:

  • The Figure is the final image, and may contain one or more Axes.

  • The Axes represents an individual plot (not to be confused with

    Axis, which refers to the x-, y-, or z-axis of a plot).

We call methods that do the plotting directly from the Axes, which gives us much more flexibility and power in customizing our plot.

Note

In general, use the explicit interface over the implicit pyplot interface for plotting.

Our data#

We'll use the data from the post from which this tutorial was derived. It contains sales information for a number of companies.

import matplotlib.pyplot as plt
import numpy as np

data = {'Barton LLC': 109438.50,
        'Frami, Hills and Schmidt': 103569.59,
        'Fritsch, Russel and Anderson': 112214.71,
        'Jerde-Hilpert': 112591.43,
        'Keeling LLC': 100934.30,
        'Koepp Ltd': 103660.54,
        'Kulas Inc': 137351.96,
        'Trantow-Barrows': 123381.38,
        'White-Trantow': 135841.99,
        'Will LLC': 104437.60}
group_data = list(data.values())
group_names = list(data.keys())
group_mean = np.mean(group_data)

Getting started#

This data is naturally visualized as a barplot, with one bar per group. To do this with the object-oriented approach, we first generate an instance of figure.Figure and axes.Axes. The Figure is like a canvas, and the Axes is a part of that canvas on which we will make a particular visualization.

Note

Figures can have multiple Axes on them. For information on how to do this, see the Tight Layout tutorial.