Python 3: Create sparklines using matplotlib
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
matplotlib.use("Agg")
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)
ax.plot(data)
for k,v in ax.spines.items():
v.set_visible(False)
ax.set_xticks([])
ax.set_yticks([])
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')
img.seek(0)
plt.close()
return base64.b64encode(img.read()).decode("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 = [
[1,2,3,4,5,6,7,8,9,10],
[7,10,12,18,2,8,10,6,7,12],
[10,9,8,7,6,5,4,3,2,1]
]
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:
About the author
I'm currently working on short form content at ClickHouse. I publish short 5 minute videos showing how to solve data problems on YouTube @LearnDataWithMark. I previously worked on graph analytics at Neo4j, where I also co-authored the O'Reilly Graph Algorithms Book with Amy Hodler.