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 work in both MATLAB and Octave.
The source code for the included examples can be found in the GitHub repository .
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, and is especially obvious 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.
a1 = subplot( 1, 3, 1 ); text( 0.5, 0.5, '1', 'fontsize', 48 ); a2 = subplot( 1, 3, 2 ); text( 0.5, 0.5, '2', 'fontsize', 48 ); a3 = subplot( 1, 3, 3 ); text( 0.5, 0.5, '3', 'fontsize', 48 );
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.
set( a1, 'fontsize', 12 ) set( a2, 'fontsize', 14 ) set( a3, 'fontsize', 16 )
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.
a1 = subplot( 3, 1, 1 ); text( 0.5, 0.5, '1', 'fontsize', 48 ); a2 = subplot( 3, 1, 2 ); text( 0.5, 0.5, '2', 'fontsize', 48 ); a3 = subplot( 3, 1, 3 ); text( 0.5, 0.5, '3', 'fontsize', 48 );
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.
for iPlot=1 : 9 subplot( 3, 3, iPlot ); text( 0.5, 0.5, num2str( iPlot ), 'fontsize', 48 ); end
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.
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.
% - Create a single plot on the top row subplot( 3, 3, 1:3 ); text( 0.35, 0.5, '1, 2, 3', 'fontsize', 48 ); % - Create a single plot in the last column subplot( 3, 3, [6, 9] ); text( 0.30, 0.5, '6, 9', 'fontsize', 48 ); % - Create a matrix in the bottom left corner subplot( 3, 3, [ 4:5, 7:8 ] ); text( 0.25, 0.5, '4, 5, 7, 8', 'fontsize', 48 );
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 centers a sub-plot in the top row and spans the sub-plot in the bottom row across all of the columns.
subplot( 2, 3, 2 ); text( 0.35, 0.5, '2', 'fontsize', 48 ); subplot( 2, 3, 4:6 ); text( 0.35, 0.5, '4, 5, 6', 'fontsize', 48 );
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.
set( f, 'units', 'normalized' ); a = subplot( 'position', [ 0.1, 0.1, 0.5, 0.8 ] ); title( a, 'Subplots are awesome!' ); set( a, 'fontsize', 16 ); a = uicontrol( f, 'units', 'normalized', 'position', ... [ 0.7, 0.7, 0.2, 0.1 ], 'style', 'pushbutton', 'string', 'Press Me' ); a = uicontrol( f, 'units', 'normalized', 'position', ... [ 0.7, 0.5, 0.2, 0.1 ], 'style', 'pushbutton', 'string', 'Click Here' ); a = uicontrol( f, 'units', 'normalized', 'position', ... [ 0.7, 0.3, 0.2, 0.1 ], 'style', 'pushbutton', 'string', 'Easy' );
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: