Plotting with Matplotlib#

Matplotlib is the default backend for ArviZ. Although most of the functions in the plot module work seamlessly with any backend, some advanced plots may require the use of backend specific features. In this guide, advanced plotting with Matplotlib will be covered.

This page can be downloaded as a Jupyter notebook.

import arviz as az
import matplotlib.pyplot as plt
import numpy as np

az.style.use("arviz-doc")

Customizing plots#

Using backend_kwargs#

The backend_kwargs argument can be very useful for some specific configuration. That is parameters available in matplotlib.pyplot.subplots(), which includes add_subplot() and GridSpec through subplot_kw and gridspec_kw respectively. As the options available depends on the backend, this parameter is not as flexible as creating custom axes.

As an example, the following code changes the facecolor from figure() and the width_ratios in the grid layout.

# load data
data = az.load_arviz_data('radon')
az.plot_posterior(
    data,
    var_names=["g"],
    backend_kwargs={
        "facecolor": "#d3d0e3",
        "gridspec_kw": {
            "width_ratios": [6,4]}});
../_images/5b1ad4270d80c686fbae4d3d5632036ecddfc8e5f0fb9455fb2e373dfd89c552.png

Caution

The parameters ncol and nrows from matplotlib.pyplot.subplots() should not be set using the backend_kwargs parameter. Instead, use the param grid

The parameter show#

The parameter show calls matplotlib.pyplot.show() if set to True. If show is not set, it will take the value from the rcParam plot.matplotlib.show which defaults to False.

Note

There are some Matplotlib backends like the inline (default) Jupyter backend that show the plot even if plt.show is not called. In such cases, plots will be shown automatically even if show=False.

Defining custom axes#

The ax argument of any plot function allows to use created axes manually. In the example, this parameter allows to arrange 2 different plots in a grid, set limit to the x axis and share the axes between the two plots.

# load data
observed_data = data.observed_data.y.values
# create axes
_, ax = plt.subplots(2, 1, sharex=True, sharey=True, figsize=(6, 6))
ax[0].set_xlim(xmin=observed_data.min() - 1, xmax=observed_data.max() + 1)
# plot
az.plot_ppc(data, group="prior", num_pp_samples=100, ax=ax[0])
az.plot_ppc(data, group="posterior", num_pp_samples=100, ax=ax[1]);
../_images/54a7460eadd33f8f0931dad58083f98cf724cd0e7bd83db7d9805599faa9401f.png

Extending ArviZ-Matplotlib plots#

As an Arviz plot returns an Axes object, different Matplotlib plots can be added to a plot generated with Arviz:

# load data
data = az.load_arviz_data('regression1d')
X = data.observed_data.y_dim_0
Y = data.observed_data.y
y_pp = data.posterior_predictive.y
# plot
ax = az.plot_hdi(X, y_pp, color="#b5a7b6")
ax.scatter(X, Y, c="#0d7591");
../_images/97747bcd434b8218d5beaaf8d0702840ffe6b2d33fb01d7b9ae01f19c0e2e4f5.png

Similarly, custom axes allow to display Arviz and Matplotlib plots in the same grid. In this example, the plot in ax1 has an Arviz plot modified with a Matplotlib plot and the ax2 has a scatter created using Matplotlib.

# create axes
_, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6), sharey=True)
# plot ax1
az.plot_hdi(X, y_pp, color="#b5a7b6", ax=ax1)
ax1.plot(X, y_pp.mean(axis=(0, 1)), c="black")
# plot ax2
ax2.scatter(X, Y, c="#0d7591");
../_images/90a15f80a840006b3882efc7d09beaa5f6cadd006fb5d84acde1d30b0904cebe.png