Advanced plots in Matplotlib — Part 1

The Python visualisation landscape consists of several useful python libraries. Every library shines in its own unique way. While some libraries are easy to use, the others have superior functionalities. Matplotlib is one such component of this visualisation ecosystem and a vital one. Matplotlib offers multiple ways to represent numbers into meaningful graphs and plots. The following cheat sheet provides an excellent glimpse of the various functionalities of Matplotlib and how to make our visualizations more effective.

Matplotlib cheat sheet. Full image:
Matplotlib cheat sheet. Full image:

The basic capabilities of matplotlib, including the ability to create bar graphs, histograms, pie charts, etc. are well known. However, in this article, I will showcase some of the advanced plots in matplotlib, which can take our analysis a notch higher.

Animations in matplotlib is another interesting functionality, and I have a dedicated a complete article to it. The article can be read here: Animations with Matplotlib.

1. Span Selector

Span Selector is a mouse widget in matplotlib. Widgets are python objects which are used to include some interactive functionality. Span Selector returns the maximum and minimum values of a selected region in a graph, through the mouse selection.

In the following code snippet, we first create a basic line plot. Then we call the SpanSelector method and use it first to select a region and then print the maximum and minimum values in that region. Let’s see it in action below.

import matplotlib.pyplot as plt
from matplotlib.widgets import SpanSelector
def onselect(xmin, xmax):
            print(xmin, xmax)
            return xmin, xmax
fig, ax = plt.subplots()
ax.plot([1,2,3,4,5,6,7], [10, 50, 100, 23,15,28,45])
span = SpanSelector(ax, onselect, 'horizontal', useblit=True,  rectprops=dict(alpha=0.5, facecolor='red'))
Matplotlib's span selector in action
Matplotlib’s span selector in action

2. Broken Barh — Broken Horizontal Bar plot

A “broken” horizontal bar plot is a plot that has gaps. It is used in situations when the data has values that vary considerably — for instance, a dataset consisting of extreme temperature ranges. Broken bar charts are ideal in this case since they can plot both the maximum and minimum ranges perfectly.

The python module matplotlib.broken_barh() is used to plot a broken horizontal bar chart.

import matplotlib.pyplot as plt
#Defining the x and y ranges
xranges = [(5,5), (20,5),(20,7)]
yrange = (2,1)
#Plotting the broken bar chart
plt.broken_barh(xranges, yrange, facecolors='green')
xranges = [(6,2), (17,5),(50,2)]
yrange = (15,1)
plt.broken_barh(xranges, yrange, facecolors='orange')
xranges = [(5,2), (28,5),(40,2)]
yrange = (30,1)
plt.broken_barh(xranges, yrange, facecolors='red')
plt.ylabel('Days of the Month')

Broken Horizontal Bar plot
Broken Horizontal Bar plot

3. Table Demo

Matplotlib’s table function can display a table within a plot. This is especially handy when one wants to see the quickly visualize values in a table in the form of a bar graph keeping the table alongside. The table can be positioned at top, bottom or on sides of the plot. Here is how you can create one easily.

The following example has been taken from a tweet by Just Glowing Python(@JustGlowing)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x = np.random.rand(5, 8)*.7
plt.plot(x.mean(axis=0), '-o', label='average per column')

plt.table(cellText=[['%1.2f' % xxx for xxx in xx] for xx in x],,loc='bottom')

Table plots in matplotlib with table at the bottom
Table plots in matplotlib with table at the top

4. Watermark Images

Sometimes having an image as a watermark helps to add a unique flavour to a plot. For instance, if we were to analyze the earnings of top athletes over the years, having their photographs in the background would help us to differentiate between plots of different players, easily. Let’s analyze a dataset consisting of income of a number of athletes. We shall plot a graph of LeBron James earnings in US$(millions) over the years.

Let’s first import the dataset, picture to be used for watermark and the necessary libraries.

import numpy as np
import matplotlib.image as image
import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('income.csv')
im = image.imread('Lebron_James.jpeg') # Image

The dataset consists of income of a number of athletes. Let’s filter out the data consisting of only Lebron.

lebron_james = df[df['Name']=='LeBron James']

Displaying the watermarked plot.

fig, ax = plt.subplots()
ax.plot('Year','earnings ($ million)',data=lebron_james)
ax.set_title("LeBron James earnings in US$(millions)")
fig.figimage(im, 60, 40,cmap='ocean', alpha=.2)

5. XKCD Plots

Now let’s add some element of fun in our plots. Xkcd is a webcomic by Randall Munroe and showcases a lot of humorous plots. These plots regularly make an appearance in a lot of data science presentations, for instance, the one below :


Well, if you want to add some twist to your matplotlib plots, you can simply call the xkcd()method on the pyplot object as follows. Here we are working with GDP dataset of India, which shows the GDP growth rate percentage from 2010 from 2019.

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('', parse_dates=['Year'])
df['Year'] = df['Year'].apply(lambda x: pd.Timestamp(x).strftime('%Y'))

#calling xkcd() method
plt.xkcd(scale=5, length=400)
df.plot(x='Year',y='GDP Growth (%)',kind='bar')
plt.ylabel('GDP Growth (%)')


These were some of the interesting and advanced functionalities available in matplotib. There are some other cool graphs and plots too, which I shall cover in my next article. In the meantime, grab an interesting dataset and put your newly learnt skills to use to get a good grasp of the topic.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s