Sub-plotting is a very powerful feature in MATLAB. They allow users to very quickly create customized data visualizations and displays. They can also be used to quickly create interactive Graphical User Interfaces (GUIs). In this tutorial, I describe three different ways to use the subplot() command and provide examples of each. The provided examples should work in both MATLAB and Octave.
Subplotdivides the current figure into rectangular panes that are numbered rowwise. Each pane contains an axes object. Subsequent plots are output to the current pane. H = subplot(m,n,p), or subplot(mnp)breaks the Figure window into an m-by-nmatrix of small axes, selects the pth axes object for for the current plot, and returns the axis handle. Graphical parameter mfrow can be used to specify the number of subplot we need. It takes in a vector of form c(m, n) which divides the given plot into m.n array of subplots. For example, if we need to plot two graphs side by side, we would have m=1 and n=2. Following example illustrates this. Plt.subplot(1, 2, 1)creating first subplot (Let us understand what exactly the function subplot(1, 2, 1) is doing. The first 2 numbers passed in the argument define the dimensions of the grid in which we want our plots to be displayed. So, in our example, the first 2 numbers are telling that we will have a grid of 1 row and 2 columns. A subplot is a secondary plot used in film and television that receives less screen time and emphasis than the main plot. Subplots may never intertwine with a story’s main plot, but to be effective, work to enhance the main plot of a film. Although subplot accepts an arbitrary number of plot objects, passing a list of plots can save typing and redundant code when dealing with a large number of plots. For example, you can share the x-axis by utlising shareX, set axis ID, and and specify the number of of rows with nrows.
The source code for the included examples can be found in the GitHub repository.
Using Basic Subplots
The subplot() function in MATLAB/Octave allows you to insert multiple plots on a grid within a single figure. The basic form of the subplot() command takes in three inputs: nRows, nCols, linearIndex. The first two arguments define the number of rows and columns that will be included in the grid. The third argument is a linear index that selects the current active plot axes. The index starts at 1 and increases from left to right and top to bottom. It’s OK if this doesn’t make sense yet, the ordering is visualized in all of the examples within this section, especially in the grid example.
Let’s start with a simple example that includes three sub-plots along a single row. For convenience, I have also used the text() function to display the linear index in each subplot.
Notice in the code for this example that I have saved the axes handle (a1, a2, a3) for each of the subplots. This is important because now that there are multiple plot axes on the figure, we will need to specify which axes we are referencing whenever we change properties. For example, if we wanted to change the font size, we would have to specify the font size on each axes. The code snippet below is an example where the font is being set to a different size on each axes. This concept extends to all other plot axes properties and shows how each sub-plot can be fully customized.
Here is another example where I have swapped the first two arguments in the subplot function and now we will create a figure with three rows.
Finally, we can create a full grid of sub-plots. In this example, I have included 3 rows and 3 columns; however, any combination can be used. This example nicely illustrates how the linear index increases.
Using Different Sized Plots
A slightly more flexible way of using subplot() is to place sub-plots over multiple points in the grid. This is accomplished by passing in an array of linear indices as third argument, rather than just a single value. So for example, subplot( 1, 3, [1, 2] ) would create a subplot grid that has three columns and a single plot that occupies the first two columns. This method lets you make some really nice looking plots that can easily accommodate various types of data.
Subplot
Let’s look at another example. The underlying grid is of shape 3 x 3. The first sub-plot is placed at the top of the grid and spans all three columns. The second sub-plot is placed in the bottom left corner and covers a 2 x 2 sub-grid. Finally, the last sub-plot is in the bottom right corner and spans the last two rows. In all cases, the linear indices have been included over the plots to illustrate which parts of the grid they are covering.
Another convenient use of populating large grids is to simply leave some empty. This is nice because it creates white space and allows you to align sub-plots at different places within the figure. Here is an example that center’s a sub-plot in the top row and spans the sub-plot in the bottom row across all of the columns.
Using Position Coordinates
Subplot Definition
The final and most flexible way to use the subplot() function is to directly specify the position of the axes. This is most easily done by using normalized figure units and specifying relative offsets within the figure. If you are unfamiliar with relative figure units, you can see a previous tutorial that covered these.
To specify a sub-plot position, you pass the keyboard “position” as the first argument in subplot(), followed by a 1 x 4 vector that describes the position. The position property contains the horizontal origin (h0), vertical origin (v0), width (w) and height (h), respectively, and is organized like this: [ h0, v0, h, v ]. Specifying sub-plots in this manner allows you to have complete control over the position and is essential if you want to programmatically create GUIs.
I have included one example below that inserts a sub-plot in the left half of the figure and three push buttons on the right half. The buttons are just for illustration. The task of creating GUIs in MATLAB is left for another tutorial. Note, for the example below, I have specified that the figure is in normalized units, however, the default unit is pixels.
Summary
In this quick tutorial, I reviewed three (well, two and a half really) different ways that you can use subplot() in MATLAB/Octave. I find this function to be extremely useful for a number of different things and use it everyday. I use all three approaches depending on what I am trying to accomplish. Play around with the examples and put in some real data to get a feel for how these types of sub-plots can be useful for you.
Some key points to remember:
- Each sub-plot has its own axes handle and properties (e.g. font size, labels, grid) that need to be individually set
- Make sure you save you axes handles and refer to them correctly
- The sub-plot index can be specified as a single value or an array of integer indices
- If you are specifying position vectors, pay attention to the figure units
Subplot Pyplot
Happy coding!