Scatter pictures with Google Charts
In a recent post on his blog Matt Cutts asks:
I almost wanted to call this post “Stupid Google Tricks” :-) What fun diagrams can you imagine making with the Google Charts Service?
Here’s a stupid trick: you can use the Python Imaging Library to convert a picture into a URL which Google charts will render as the original picture.
Here’s the original picture:
here’s the version served up by Google charts:
here’s the code:
import Image import string def scatter_pixels(img_file): """Return the URL of a scatter plot of the supplied image The image will be rendered square and black on white. Adapt the code if you want something else. """ # Use simple chart encoding. To make things really simple # use a square image where each X or Y position corresponds # to a single encode value. simple = string.uppercase + string.lowercase + string.digits rsimple = simple[::-1] # Google charts Y reverses PIL Y w = len(simple) W = w * 3 img = Image.open(img_file).resize((w, w)).convert("1") pels = img.load() black_pels = [(x, y) for x in range(w) for y in range(w) if pels[x, y] == 0] xs = "".join(simple[x] for x, _ in black_pels) ys = "".join(rsimple[y] for _, y in black_pels) sqside = 3.0 return ( "http://chart.apis.google.com/chart?" "cht=s&" # Draw a scatter graph "chd=s:%(xs)s,%(ys)s&" # using simple encoding and "chm=s,000000,1,2.0,%(sqside)r,0&"# square black markers "chs=%(W)rx%(W)r" # at this size. ) % locals()
and here’s the url it generates:
http://chart.apis.google.com/chart?cht=s&chd=s:DDEEEEEEE…&chs=186x186
Smallprint. Google charts may return a 400 error for an image with a long URL (meaning lots of black pixels in this case). The upper limit on URL length doesn’t seem to be documented but a quick trawl through topics on the google charts group suggests others have bumped into it too. Connoisseurs of whacky pictures should pay CSS Homer Simpson a visit.