Subplots in matplotlib
In a previous post we learned how to use matplotlib’s
gridspec to make subplots of unequal size.
gridspec is quite powerful, but can be a little complicated to use. This is especially true if you are coming to Python from Matlab.
In the current post we learn how to make figures and subplots in a manner that will be more familiar to those who know Matlab.
Importing modules and creating data to plot
The first thing we need to do is import
matplotlib.pyplot for plotting and
numpy to calculate the cosine of some data. To save on typing we will import these libraries using aliases:
import matplotlib.pyplot as plt import numpy as np # Create data X = np.linspace(-np.pi, np.pi, 256, endpoint=True) Y = np.cos(X)
A basic plot
The simplest plot requires a single line of code:
The resulting figure is show below.
plt.plot() is similar to Matlab’s
plot() function. In this case it is plotting the
Y values against the
Working with subplots
A slightly more complicated figure can be achieved by splitting things into various subplots. The following example creates an 8 inch x 8 inch figure with 2 rows and 2 columns of subplots, resulting in a total of 4 subplots.
plt.figure(figsize=(8,8)) plt.subplot(2,2,1) plt.plot(X, Y, color="blue") plt.title('subplot(2,2,1)') plt.subplot(2,2,2) plt.plot(X, Y*-1, color="red") plt.title('subplot(2,2,2)') plt.subplot(2,2,3) plt.plot(X, Y*-1, color="green") plt.title('subplot(2,2,3)') plt.subplot(2,2,4) plt.plot(X, Y, color="black") plt.title('subplot(2,2,4)')
As can be seen in the code above, subplots are specified using
plt.subplot(), similar to Matlab’s
subplot(). The three values passed to this command
(rows, columns, subplot_id). In the above example we wanted 2 columns and 2 rows. The third number specified the current subplot; any plotting after the
plt.subplot() command appears on the subplot specified by
subplot_id. In the figure below, the input to
plt.subplot() is included in the title of each subplot. Subplots start at
1 and go from left to right in the first row, and then left to right in all subsequent rows.
Subplots of unequal size
Similar to Matlab, it is possible to pass more than one value as the
subplot_id. This results in a subplot that occupies the space of the specified subplots.
plt.figure(figsize=(8,8)) plt.subplot(2,2,1) plt.plot(X, Y, color="blue") plt.title('subplot(2,2,1)') plt.subplot(2,2,2) plt.plot(X, Y*-1, color="red") plt.title('subplot(2,2,2)') plt.subplot(2,2,(3,4)) plt.plot(X, Y*-1, color="green") plt.plot(X, Y, color="black") plt.title('subplot(2,2,(3,4))')
In the code above, the third call to
plt.subplot() specified two values for the
subplot_id. Specifically, we provide
(3,4) as the
subplot_id, which means this subplot will occupy the space of the third and fourth subplots in a 2 row by 2 column grid. This corresponds to the entire bottom row, and is illustrated in the figure below.
To make sure this concept is clear, a second example is provided where the
(2,4). In a 2 row by 2 column grid, this corresponds to a subplot that occupies the entire right column. This is illustrated in the figure below.
Including subplots is simple in matplotlib and the similarity between
plt.subplot() and Matlab’s
subplot() commands should help make the transition to Python easier.