HN Karma

Since getting interested in HackerNews (http://news.ycombinator.com) I've kept a track of my karma to see what it does. Every now and again I draw a little graph, and check its changes against items I've submitted, or periods of activity.

I don't really care much for karma - I think it's measuring the wrong thing and encouraging sub-optimal behaviour, but I don't say too much about it, because I don't have a better suggestion.

Anyway, today I plotted a graph of my karma, just using Python to create a PGM file:

    #!/usr/bin/python

    size_x, size_y = 640, 480

    def get_data():
        p = {}
        h = file('karma.data')
        mx,my=-1,-1
        for l in h.xreadlines():
            fields = l.split()
            x,y = (int(fields[2]),int(fields[6]))
            if mx<x:mx=x
            if my<y:my=y
            p[(x,y)] = 1
        h.close()
        return mx,my,p

    handle = file('KarmaGraph.pgm','w')
    handle.write('P5\n%d %d\n255\n' % (size_x,size_y))
    mx,my,p = get_data()
    print 'Max x:',mx
    print 'Max y:',my
    remap = {}
    for (x,y) in p:
        remap[(x*(size_x-1)/mx,y*(size_y-1)/my)] = 1

    for gy in range(size_y,-1,-1):
        line = size_x*[0]
        for x,y in remap:
            if gy==y:
        line[x]=255
    handle.write(''.join([ chr(c) for c in line ]))

It's not great code, and I've removed some of the error checking, but it works well enough as a throw-away script.

It produced this:

That's a little difficult to see the structure, so I changed the code, replacing this line:

    line[x]=255
with this line:
    line = x*[255] + (size_x-x)*[0]
which gave me this:

It's easier to see what's going on, but I thought I'd prefer a proper line graph. Usingthe Gimp I blurred the existing data:

And then flood-filled the area under the notational line:

Finally, some thresholding gave me the indication I wanted:

It's important to note that this is just for pretty visualisation. In particular, it's not especially accurate, as the line is shifted down/across from where it really should be:

But for my purposes, it'll do.