Creating figures

ProPlot works by subclassing the matplotlib Figure and Axes classes. You can generate grids of proplot Axes axes on a proplot Figure using the subplots command.

import proplot as plot
f, axs = plot.subplots(...)

Just like with the pyplot version, you can use subplots without arguments to generate a single-axes subplot or with ncols or nrows to set up simple grids of subplots.

Simple subplot grids

In the below example, we create a simple subplot grid with subplots, populate it with some lines, and modify the axes (see Axes object containers and The format command for details).

[1]:
import proplot as plot
import numpy as np
state = np.random.RandomState(51423)
f, axs = plot.subplots(ncols=2)
axs[0].plot(2*(state.rand(100,5)-0.5).cumsum(axis=0), lw=2)
axs[0].format(xticks=20, xtickminor=False)
axs.format(suptitle='ProPlot API', title='Title', xlabel='x axis', ylabel='y axis')
_images/figures_4_0.svg

Complex subplot grids

To draw complex subplot grids in matplotlib, you have to call add_subplot a bunch of times in sequence. In ProPlot, you pass a 2D array of integers to subplots. Just think of this array as a “picture” of your figure, where each unique integer corresponds to a unique axes and 0 corresponds to an empty space. See the below examples.

[2]:
import proplot as plot
import numpy as np
state = np.random.RandomState(51423)
data = 2*(state.rand(100,5)-0.5).cumsum(axis=0)
# Complex grid
array = [[1,1,2,2],[0,3,3,0]]
f, axs = plot.subplots(array, axwidth=1.5)
axs.format(abc=True, abcloc='ul', suptitle='Complex subplot grid', xlabel='xlabel', ylabel='ylabel')
axs[2].plot(data, lw=2)
# Really complex grid
array = [[1,1,2],[1,1,6],[3,4,4],[3,5,5]]
f, axs = plot.subplots(array, width=5, span=False)
axs.format(suptitle='Really complex subplot grid', xlabel='xlabel', ylabel='ylabel', abc=True)
axs[0].plot(data, lw=2)
[2]:
(<matplotlib.lines.Line2D at 0x7f68d0800128>,
 <matplotlib.lines.Line2D at 0x7f68d07c6b70>,
 <matplotlib.lines.Line2D at 0x7f68d07dd668>,
 <matplotlib.lines.Line2D at 0x7f68d07dd518>,
 <matplotlib.lines.Line2D at 0x7f68d07dda58>)
_images/figures_7_1.svg
_images/figures_7_2.svg

Subplot numbers and labels

ProPlot assigns unique numbers to subplots. The number order determines the order the subplots appear in the axes_grid and the order of “a-b-c” labels generated by format. If you did not provide a 2D array, the number order is row-major by default but can be made column-major by passing order='F' to subplots. The “a-b-c” label position and style can be changed with format.

[3]:
import proplot as plot
f, axs = plot.subplots(nrows=8, ncols=8, axwidth=0.7, space=0)
axs.format(abc=True, abcloc='ur', xlabel='x axis', ylabel='y axis',
           xticks=[], yticks=[], suptitle='Flush subplot grid')
_images/figures_10_0.svg

Axes object containers

Instead of an ndarray of axes, subplots returns a special axes_grid container. This container behaves like a python list, but lets you call any command on multiple axes at once. It supports both 2D indexing (e.g. axs[0,1]) and 1D indexing (e.g. axs[2]), and is row-major by default. Further, slicing an axes grid (e.g. axs[:,0]) returns another axes grid.

You can make your own axes_grid by passing a list of axes to the class. In the below example, the axes_grid returned by subplots is used to call The format command on several axes at once.

[4]:
import proplot as plot
import numpy as np
state = np.random.RandomState(51423)
f, axs = plot.subplots(ncols=5, nrows=5, axwidth=0.8)
axs[:,0].format(color='red8')
axs[0,:].format(color='blue8')
for ax in axs[1:,1:]:
    ax.plot(state.rand(10,4), color='gray7', cycle_kw={'linestyle':('-',':','--','-.')})
axs[0].format(color='black', linewidth=2)
axs.format(xlabel='xlabel', ylabel='ylabel', suptitle='Axes grid demo')
_images/figures_13_0.svg