Matplotlib: Plot
The plot()
function plots the $y$ versus $x$ graph as lines and/or markers. It is one among the many command-like functions of the matplotlib.pyplot
interface. The typical examples of the $y$ vs $x$ graphs we come across in school are the distance-time graphs (distance along the $y$-axis, time along the $x$-axis), speed-time graphs, period-length graphs of a simple pendulum, etc. In this tutorial, we pick the temperature-time graphs to plot using the plot()
function.
Consider the monthly average temperatures (°C) in Singapore, as given by https://www.holiday-weather.com/. We represent them in a one-dimensional array.
[26,27,27,27,27,27,27,27,27,27,26,26]
We provide this array as a single argument to the plot()
function in the program below.
import matplotlib.pyplot as plt
plt.plot([26,27,27,27,27,27,27,27,27,27,26,26])
plt.ylabel('Temperature (°C)')
plt.show()
Matplotlib assumes this to be the set of values along the $y$-axis (ordinates) and auto creates the $x$ values of the same length. Save this program as temperature.py
inside some directory, say, /python-programs
. Next, navigate to the /python-programs
directory and run it.
$python3 temperature.py
The resulting graph looks as follows:
The 0, 1, 2, ... along the $x$-axis do not indicate anything much; they can mean anything or nothing.
So let us be specific of the months. We can set the month as the array [1,2,3,4,5,6,7,8,9,10,11,12] to be plotted along the $x$-axis, where 1 means January, 2 means February, and so on. This array goes as the first argument of the plot()
function and our previous array consisting of temperature values goes as the second argument. The two arrays need to be of the same length.
x = [1,2,3,4,5,6,7,8,9,10,11,12]
y = [26,27,27,27,27,27,27,27,27,27,26,26]
plt.plot(x,y)
Also we now label the $x$-axis and give the title of the graph.
plt.xlabel('Months')
plt.title('Temperature in Singapore')
Better still, we can apply custom colours to them.
plt.xlabel('Months', color='#1e8bc3')
plt.title('Temperature in Singapore', color='#34495e')
Now our program becomes more complete,
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8,9,10,11,12]
y = [26,27,27,27,27,27,27,27,27,27,26,26]
plt.plot(x,y)
plt.xlabel('Months', color='#1e8bc3')
plt.ylabel('Temperature (°C)', color='#e74c3c')
plt.title('Temperature in Singapore', color='#34495e')
plt.show()
and the generated graph has a meaningful abscissae.
So far, we have only seen one type of line style in blue. We can add another parameter to the plot()
function and generate other types. The default value is b-
, where b
stands for blue and -
is the line style. So, basically, we can replace the line
plt.plot(x,y)
in our above temperature.py
program with
plt.plot(x,y,'b-')
and it would generate the same.
Now, besides the colour b
(blue), there are other basic built-in colours. We list them below along with their single-letter codes:
- b: blue
- g: green
- r: red
- c: cyan
- m: magenta
- y: yellow
- k: black
- w: white
Similarly, besides -
(dash), there are three other line-styles available.
Also, instead of the line, we can also use markers. For the discrete data we provided to the plot()
function, the markers provide a much truer graph than the continuous graphs we plotted with lines. The possible markers in Matplotlib are listed below.
In the following, we generate a few graphs with different combinatons of colours and line styles/markers: m^
(magenta triangles), rs
(red squares), g--
(green dashes), c*
(cyan asterisk)
Plot Multiple Lines/Multiline Plots
Often we need to plot multiple lines on the same graph, applying different colours and line styles and/or markers to each. Let us now consider the monthly average high and low temperatures. We can overload the plot()
function with $x$-$y$ (hours-temperature) list pairs as shown below.
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8,9,10,11,12]
y = [30,31,31,31,31,31,31,31,31,31,30,29] # average high
z = [23,24,24,24,25,24,24,24,24,24,24,23] # average low
plt.plot(x,y, 'm-.', x, z, 'c:')
plt.xlabel('Months', color='#1e8bc3')
plt.ylabel('Temperature (°C)', color='#e74c3c')
plt.title('Temperature in Singapore', color='#34495e')
plt.show()
Let us also add legend to the graph to identify the different lines.
import matplotlib.patches as mpatches
high_legend = mpatches.Patch(color='magenta', label='High')
low_legend = mpatches.Patch(color='cyan', label='Low')
plt.legend(handles=[high_legend,low_legend])
The consolidated code now becomes:
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
x = [1,2,3,4,5,6,7,8,9,10,11,12]
y = [30,31,31,31,31,31,31,31,31,31,30,29] # average high
z = [23,24,24,24,25,24,24,24,24,24,24,23] # average low
plt.plot(x,y, 'm-.', x, z, 'c:')
plt.xlabel('Months', color='#1e8bc3')
plt.ylabel('Temperature (°C)', color='#e74c3c')
plt.title('Temperature in Singapore', color='#34495e')
high_legend = mpatches.Patch(color='magenta', label='High')
low_legend = mpatches.Patch(color='cyan', label='Low')
plt.legend(handles=[high_legend,low_legend])
plt.show()
Adding Markers to a Line Plot
A marker can be added right after the line style. In the below plot, we add the marker o
to the line -
.
import matplotlib.pyplot as plt
x = [1,2,3,4,5,6,7,8,9,10,11,12]
y = [26,27,27,27,27,27,27,27,27,27,26,26]
plt.plot(x,y, 'g-o')
plt.xlabel('Months', color='#1e8bc3')
plt.ylabel('Temperature (°C)', color='#e74c3c')
plt.title('Temperature in Singapore', color='#34495e')
plt.show()
Plotting y=f(x)
Plotting $y=f(x)$ kind of equations, both linear and non-linear (quadratic, cubic or polynomial), require creation of finer evenly spaced points in an interval and hence necessitates importing NumPy to use functions such as linspace()
and arange()
. Here we will not go further into any of them here as separate tutorials have been dedicated on plotting linear and non-linear equations.