Adding Annotations to Seaborn Plots

Balaji Sundararaman
4 min readNov 5, 2020

--

..insert text & numbers

Photo by Kelli McClintock on Unsplash

Seaborn is a plotting library which provides us with plenty of options to visualize our data analysis. Based on matplotlib, seaborn enables us to quickly generate a neat and sleek visualization with sensible defaults with a single line of code. Most of our visualization needs during Exploratory Data Analysis (EDA) are adequately and easily handled by seaborn. However, one aspect which one may have found wanting with these plots is to be able to annotate these plots with values and other highlights which would more effectively bring out the story or insight you are trying to extract from the data.

Below, I will show you a couple of ways in which you can add annotations (eg. value of median in a box plot or the value corresponding to a barplot) to your plots.

First up, let us load the required libraries.

The basic python libraries required

We will use the in-built tips dataset from seaborn.

tips is an in-built data set for demo purposes included with seaborn
a snapshot of the tips dataset
Dimensions of the tips dataset

The tips dataset has 244 observations of 7 features that include the total bill amount, tip amount, gender of the person paying the bill, whether he/she is a smoker or not, day on which the meal was had, time (dinner/lunch) and size of the group having the meal.

Now, say we want to check out the distribution of the total bill value by day of the week to see if there is any difference. It is easily done using the boxplots for each day of the week.

But wouldn't it be great if we could also display the median value of total bill on each day of the week? Yes, that would be nice and we can do it! First, let us calculate the median total bill amount day-wise using the groupby( ) function.

The annotate function of the plot object comes to our rescue for inserting these values into the plot. It takes 2 parameters — the text to be displayed as a string data type and the xy argument through which you can specify the location of the text as a tuple for the x and y coordinates. You may have to play around with the y coordinate to work out the best possible alignment for your plot. Since we have a categorical feature day along the x axis, the category labels (thu— sun) correspond to the x coordinate of 0 to 3.

Similarly, you can add Q1, Q3 values if you prefer.

Another way to do this is using the text function of the plot object. To demonstrate this, we will now plot the same two features (day & total bill) as a bar plot. First, let's plot the plain vanilla bar plot which shows us the mean value of the total bill amount for each day.

Now, we will add the annotation (the mean value of the total bill amount) using the text function. This function takes in similar parameters like annotate to do the job. First is the x coordinate, then y and then the string to display at the specified location. Other font-related aesthetics settings can be passed as a dictionary to the fontdict parameter of the function.

If you want the mean bill amount to be shown above each bar instead of within, just replace means[i]/2 by means[i] + 0.25 (an offset so that the value is displayed above the bar and doesn't clash with it).

--

--

Balaji Sundararaman

Passionate about Data Analytics, Visualization and Machine Learning with extensive experience across functions in India’s emerging Fintech vertical