Module 3: PLOTTING

Lesson 3.3 – Advanced Plotting

Learning Objectives

  1. represent data in a bar graph,

  2. create line and surface plots in three dimensions,

  3. graph data in a polar plot.


Does MATLAB have more plotting capabilities?

In the previous lessons in this module (Lessons 3.1 and 3.2), we learned how to create and work with plots represented in two dimensions. However, sometimes you may want to show the data in a different type of plot. Although we will only cover a few of the more common advanced plotting capabilities in this lesson, MATLAB offers many other useful plotting formats. In this lesson, we cover bar graphs, 3D line and surface plots, and polar plots. This will give you a very good foundation to branch out to other options MATLAB offers if you need to do so in the future.


How can I create a bar graph?

Bar graphs are a great means to show quantities across groups. For example, a bar graph may be used to display how many students have received a certain discrete grade on an exam.  

MATLAB uses the bar() function to create a bar graph. We demonstrate how to create a bar graph in Example 1 as well as change some essential parameters. In the first graph, there is a one-to-one correlation between groups and their values. However, in the second graph, we have a row of y data for each x data point. This results in “bar series”, which you can see in the graph output (Figure 1).

You can review the documentation for the syntax specifics on a number of functional and formatting options like line color (outlines, fills, etc.), width, and style. Try to play around with the code and change the values of each of the inputs to get a sense of what aspect of the final output bar graph changes! One important additional thing to know is that bar() does not accept strings as categories directly. This means if your categories are strings (Example 1 has numbers as categories), you will need to use the function `categorical()` to convert your categories (strings) into an appropriate data type. You can review the MATLAB documentation for bar() to see an example of this case.

Example 1

Display the data sets given below (Data set 1 and Data set 2) with two separate bar graphs. The “groups” (horizontal axis) are “21”, “22”, “23”. Make all the bars black for data set 1, and use three different bar colors for data set 2. Put a title and axis labels on the figure for data set 2.

Data Set 1: \(\displaystyle\begin{bmatrix}\text{1.1} & \text{8.4} & \text{5.1} \\\end{bmatrix}\)

Data Set 2: \(\begin{bmatrix}\text{1.1} & \text{1.4} & \text{1.6} \\\text{8.1} & \text{8.8} & \text{8.4} \\\text{5.5} & \text{5.7} & \text{5.6} \\\end{bmatrix}\)


Figure 1: Figure outputs for Example 1.


How can I create a 3D line plot?

Plotting in three dimensions can be useful when visualizing a function with two independent variables which could be over space, time, or any other changing quantity (e.g., \(z(x,y),\ y(x,t)\), etc.). For example, it may be useful to visualize the speed of a car over time and across a number of starting speeds (using \(x(t,v_i)=v_i-a\cdot t\)). To do this, MATLAB makes plotting in three dimensions very straightforward with both 3D line plots and 3D surface plots.

As the name suggests, a 3D line plot shows a line drawn across three dimensions. A 3D line plot is generated with the plot3() function as seen in Example 2. Note that the plot3() function is just like the conventional 2D plot() function from previous lessons; however, it needs one additional dependent variable parameter in the third dimension.

Sometimes, you may wish to set the aspect ratio between axes to be 1:1:1. You can do this using the daspect() function, which allows you to adjust the ratio between all three axes.

Example 2

Create a 3D line plot from the functions \(x=t,\ y=2\sin(4t)\), and \(z=\cos(4t)\) for t values of 0 to 5 with an interval of 0.01. Note that any axis can be independent/dependent on a 3D plot.


Figure 2: Figure output of a 3D line plot for Example 2.


How can I create a 3D surface plot?

Visualizing a surface in 3D requires that all surface points that we want to plot to be defined in 3D (of course). This is not as simple as giving three vectors like we did for plotting a 3D line because we now have a surface to plot. You could think of this as many lines stacked against each other. There are two main steps to getting the coordinates we need for a 3D surface. The first part of this process is to create a grid of independent coordinate points. Next, we use these 2D points to generate the third dimension, which is similar to generating a vector for a 2D function like we saw in previous lessons in this module (Lessons 3.1 and 3.2).

Fortunately, MATLAB provides the meshgrid() function to automate the process of creating a mesh of surface points. We only need to give a vector input for each independent variable (dimension), and meshgrid() will do the rest! Figure 3 shows an example of how meshgrid() creates coordinate grids (matrices) from vector inputs.

Once the two coordinate grids (X and Y) are obtained, those two matrices are used to create a third matrix of points as shown in Figure 3. This third matrix will be plotted as the dependent variable (i.e., Z(X,Y)) on the 3D plot. You can see further explanation and documentation of this process for meshgrid() in MATLAB documentation.

Figure 3: Visual demonstration of how meshgrid() generates coordinate grids, X and Y, (matrices) from range vector inputs. The right side shows the application of these grids in order to generate a dependent function Z(X,Y) in three dimensions.

After each of the three coordinate grid matrices is created (two independent and one dependent), the surf() function can be used to plot the surface coordinates (surface defined by the function) as shown in Example 3. Note that you can change the color theme of the surface with the colormap command. The different color themes that can be used with colormap are given in Table 1. There are many more color theme options than we can show here including making complete custom theme colors.

Table 1: Some common color themes for the colormap command to use with 3D surface plots.

Color Theme & Syntax Example Usage
spring colormap spring
summer colormap summer
autumn colormap autumn
winter colormap winter
hot colormap hot
gray colormap gray

Example 3

Create a 3D surface plot of the function \(Z=\cos(X)+0.1Y+1\). Use values from -4 to 8 for the X variable with a step size of 0.3. For variable Y, use values from 0 to 10 with a step size of 0.5. Specify the colormap theme ‘autumn’.


At the end of the example code, we use the function daspect(). Using daspect() to manually set the aspect ratio for axes ensures that the figure will not be skewed or stretched in a way that we do not want.

Figure 4: Figure output of a 3D surface plot for Example 3.

Similar results to Figure 4 of creating a 3D surface can be obtained by using the mesh() or contour() function instead of the surf() function. The mesh() function (not to be confused with meshgrid()) creates a wire surface, while the contour() function creates a 2D contour map (similar to a heat map) of the surface.


How can I create a polar plot?

Some data will require you to visually analyze functions in the polar (or radial) coordinate system, where data points vary around some center point. For example, the forces around a stationary wheel vary around the wheel (i.e., force is a function of angle).  

We can plot such 2D polar/radial functions with the polarplot() function (use polar() for previous versions (before R2016a)), which accepts an angle vector (independent variable in Example 1) and a radius vector (dependent variable in Example 1). Line properties such as color or width can be changed in the same way used in plot().


Important Note: The angle vector for polarplot() must be in radians: not degrees.

Example 4

Plot the function \(r=2\cos(5\theta)\) on a polar plot. Use theta values from 0 to \(3\pi/2\) with an interval of 0.01. Set appropriate limits on the plot.


While polar plots function similar to “regular” 2D Cartesian plots, changing specifics of the plot like the grid, labels, font, spacings, etc. require a different set of axis properties called polar axis properties.  For example, ylim() is rlim() and yticks() is rticks() for polar axes. You can see an application for this in Example 4.

Figure 5: Figure output of a 2D polar plot for Example 4.


Lesson Summary of New Syntax and Programming Tools

Task Syntax Example Usage
Create a bar graph bar() bar(groups,values)
Format group names to be used with bar() categorical() categorical({'group1', 'group2'})
Create a 3D line plot plot3() plot3(x,y,z)
Set aspect ratio between plot axes daspect() daspectdaspect([1,1,1])
Creates mesh of surface points for 3D surface plot meshgrid() mesh grid([1:10],[1:10])
Plot surface coordinates surf() surf(x,y,z)
Give surface a color theme colormap colormap winter
Create a polar plot polarplot() polarplot(theta,r)
Set custom limits on the radial axis rlim() rlimrlim([rMin, rMax])
Set custom limits on the angular axis thetalim() thetalim([thetaMin, thetaMax])
Set custom tick values for the radial axis rticks() rticks({'r1','r2','r3'})
Set custom tick values for the angular axis thetaticks() thetaticks({'t1','t2'})

Multiple Choice Quiz

(1). To create a 3D line plot, the correct function and inputs are

(a)  plot3(x,y,z)

(b)  plot3d(x,y,z)

(c)  plot(x,y,z)

(d)  3D(x,y,z)


(2). To create a 3D surface plot, the correct function is

(a)  surf()

(b)  contour()

(c)  surfplot()

(d)  surf3d()


(3). For a 3D surface plot, the inputs should be

(a)  matrices

(b)  vectors

(c)  integers

(d)  strings


(4). To place a label on the x-axis of a 3D plot, one should use

(a)  xlabel()

(b)  xlabel3()

(c)  label1()

(d)  label3d()


(5). For a 3D line plot, the inputs should be

(a)  matrices

(b)  vectors

(c)  integers

(d)  strings

Problem Set

(1). Create a bar graph of the movies that are currently in the top five for the highest domestic, opening weekend box office numbers (given below in Table A). Make the bars on the graph red and be sure to make your graph look nice. Add a title, change the y-axis tick labels to be in millions (e.g., $200 million would be “200”), and y-axis label (be sure to note the scale is in millions).

Table A: Top five box office numbers (domestic) for the opening weekend of the movie.

Movie Title (abbreviated) Avengers:
Infinity War
The Force Awakens
The Last Jedi
Jurassic World
The Avengers
Opening Weekend Box Office ($) 257,698,183 247,966,675 220,009,584 208,806,270 207,438,708


(2). Plot the parametric functions \(x=2t\), \(y=\cos(3t)\), \(z=\sin(2t)\) using values for t of 0 to 10 with an interval of 0.1. Use a red line with a line width of 3.

Try exploring the plot by clicking Tools>Rotate 3D from the figure window menu. Note how the plot looks if you rotate it to view only the XY or XZ planes.


(3). Plot the hyperbolic function\(f(x,y)=x^2+y^2\) using values from -3 to 3 with an interval of 0.1 for x and y. Choose a color theme that you like and put a grid on the plot. Place axis labels on all three axes. Remember to use the array operator for the exponents in this problem (Lesson 3.1).


(4). Plot the equation \(z=\ln(x^2+y^2)\) using values from -2 to 2 with an interval of 0.1 for x and y. Choose a color theme that you like and put a grid on the plot. Place axis labels on all three axes. Remember to use the array operator for the exponents in this problem (Lesson 3.1).


(5). Plot the function for theta values of 0 to 4 in steps of 0.01 using a polar plot. Change angular (theta) axis ticks and tick labels to be aligned with \(0\), \(\pi/4\), \(\pi/2\), \(3\pi/4\), etc. Be sure to use the symbol for pi.