Mark Needham

Thoughts on Software Development

Archive for the ‘edward tufte’ tag

Python 3: Create sparklines using matplotlib

without comments

I recently wanted to create sparklines to show how some values were changing over time. In addition, I wanted to generate them as images on the server rather than introducing a JavaScript library.

Chris Seymour’s excellent gist which shows how to create sparklines inside a Pandas dataframe got me most of the way there, but I had to tweak his code a bit to get it to play nicely with Python 3.6.

This is what I ended up with:

import matplotlib
import matplotlib.pyplot as plt
import base64
from io import BytesIO
def sparkline(data, figsize=(4, 0.25), **kwags):
    Returns a HTML image tag containing a base64 encoded sparkline style plot
    data = list(data)
    fig, ax = plt.subplots(1, 1, figsize=figsize, **kwags)
    for k,v in ax.spines.items():
    plt.plot(len(data) - 1, data[len(data) - 1], 'r.')
    ax.fill_between(range(len(data)), data, len(data)*[min(data)], alpha=0.1)
    img = BytesIO()
    plt.savefig(img, transparent=True, bbox_inches='tight')
    return base64.b64encode("UTF-8")

I had to change the class used to write the image from StringIO to BytesIO and I found I needed to decode the bytes produced if I wanted it to display in a HTML page.

This is how you would call the above function:

if __name__ == "__main__":
    values = [
    with open("/tmp/foo.html", "w") as file:
        for value in values:
            file.write('<div><img src="data:image/png;base64,{}"/></div>'.format(sparkline(value)))

And the HTML page looks like this:

2017 09 23 07 49 32

Written by Mark Needham

September 23rd, 2017 at 6:51 am