import sys sys.path.append('/path/to/Imaging-1.1.6/PIL') sys.path.append('/path/to/Imaging-1.1.6/build/lib.macosx-10.5-i386-2.5') import Image, ImageDraw import StringIO import urllib blogVisits = [2,10,9,3,3,5,7,7,6,5,7,1,3,4,3,4,5,6,27,10,11,13,6,9,6,5,9,32,30,10,6,11,10,13,3,9,9,10,4,4,6,4,5,4,5,8] def plot_sparkline(results): """Returns a sparkline image as a data: URI. The source data is a list of values between 0 and 100. Values greater than 95 are displayed in red, otherwise they are displayed in green""" im = Image.new("RGB", (len(results)*2, 15), 'white') draw = ImageDraw.Draw(im) for (r, i) in zip(results, range(0, len(results)*2, 2)): color = (r > 50) and "red" or "gray" draw.line((i, im.size[1]-r/10-4, i, (im.size[1]-r/10)), fill=color) del draw f = StringIO.StringIO() im.save(f, "PNG") return 'data:image/png,' + urllib.quote(f.getvalue()) def plot_sparkline2(results): height = 20 dmin = 1 dmax = 32 step = 3 im = Image.new("RGB", ((len(results)-1)*step+4, height), 'white') draw = ImageDraw.Draw(im) coords = zip(range(1,len(results)*step+1, step), [height - 3 - (y-dmin)/(float(dmax - dmin +1)/(height-4)) for y in results]) draw.line(coords, fill="#888888") end = coords[-1] draw.rectangle([end[0]-1, end[1]-1, end[0]+1, end[1]+1], fill="#FF0000") min_pt = coords[results.index(min(results))] draw.rectangle([min_pt[0]-1, min_pt[1]-1, min_pt[0]+1, min_pt[1]+1], fill="#0000FF") max_pt = coords[results.index(max(results))] draw.rectangle([max_pt[0]-1, max_pt[1]-1, max_pt[0]+1, max_pt[1]+1], fill="#00FF00") del draw f = StringIO.StringIO() im.save(f, "PNG") return 'data:image/png,' + urllib.quote(f.getvalue()) #return f.getvalue() if __name__ == "__main__": import random html = """

Does my sparkline fit in a nice paragraph of text?

""" print html % plot_sparkline2(blogVisits)