Error bars in Matplotlib


Martin McBride, 2022-06-23
Tags matplotlib bar chart error bars
Categories matplotlib

We can add error bars to our chart, to indicate the degree of variation in the data. Here is what it looks like:

Here is the code to plot this chart:

import matplotlib.pyplot as plt
import csv

with open("2009-temp-monthly-list.csv") as csv_file:
    csv_reader = csv.reader(csv_file, quoting=csv.QUOTE_NONNUMERIC)
    temperature_lists = list(csv_reader)

month_names = ["J", "F", "M", "A", "M", "J",
               "J", "A", "S", "O", "N", "D"]

months = range(12)

temperature = [sum(k)/len(k) for k in temperature_lists]
errors = [(max(k)-min(k))/2 for k in temperature_lists]

plt.title("Temperature bar chart 2009")
plt.xlabel("Month")
plt.ylabel("Temperature")
plt.bar(months, temperature, yerr=errors)
plt.xticks(months, month_names)
plt.show()

This code is available on github as barchart_error_bars.py.

We will look at the important new features used in this code.

The data

Since we want to plot tha variance of the data, we cannot use the 2009-temp-monthly.csv data. That data only contains one value for each month, the average value.

Instead, we use the 2009-temp-monthly-list.csv data. This is a list of 12 sublists. Each sublist contains the temperatures of each day in the month. The first sublist contains 31 values corresponding to the temperatures of the 31 days in January. Yje second contains 28 values for the days in February, and so on. This is read into temperature_lists in the code above.

See the description of the data sets.

Processing the data

We need to calculate 2 sets of values:

  • The average temperature for each month. This creates a list temperature of 12 values that determine the height of each bar in the graph.
  • The error range of temperatures for each month. This creates a list errors of 12 values that determine the length of each error bar.

Here are the calculations:

temperature = [sum(k)/len(k) for k in temperature_lists]
errors = [(max(k)-min(k))/2 for k in temperature_lists]

To calculate the average temperature, we loop over every sublist k. We divide the sum of the elements in the sublist (given by sum(k)) by the number of the elements in the sublist (given by len(k)), which of course tells us the mean average. This will be the same value that is present in the 2009-temp-monthly.csv data.

We also calculate the error range errors for each month. There are various ways to calculate this, and you can use whichever one you prefer. To keep things simple, we just take the difference between the maximum value and the minimum value, divided by 2.

Plotting the error bars

Here is how we plot the error bars:

plt.bar(months, temperature, yerr=errors)

We simply pass in the errors list as the yerr parameter.

If you found this article useful, you might be interested in the course Introduction to Matplotlib by the same author.

Prev

Popular tags

2d arrays abstract data type alignment and angle animation arc array arrays bar chart bar style behavioural pattern bezier curve built-in function callable object chain circle classes clipping close closure cmyk colour combinations comparison operator comprehension context context manager conversion count creational pattern data science data types decorator design pattern device space dictionary drawing duck typing efficiency ellipse else encryption enumerate fill filter font font style for loop function function composition function plot functools game development generativepy tutorial generator geometry gif global variable gradient greyscale higher order function hsl html image image processing imagesurface immutable object in operator index inner function input installing iter iterable iterator itertools join l system lambda function len lerp line line plot line style linear gradient linspace list list comprehension logical operator lru_cache magic method mandelbrot mandelbrot set map marker style matplotlib monad mutability named parameter numeric python numpy object open operator optimisation optional parameter or pandas partial application path pattern permutations pie chart polygon positional parameter print pure function python standard library radial gradient range recipes rectangle recursion reduce regular polygon repeat rgb rotation roundrect scaling scatter plot scipy sector segment sequence setup shape singleton slice slicing sound spirograph sprite square str stream string stroke structural pattern subpath symmetric encryption template text text metrics tinkerbell fractal transform translation transparency triangle truthy value tuple turtle unpacking user space vectorisation webserver website while loop zip