From 044a449b46b91d8b74a1efa1bb482b4d5db5574f Mon Sep 17 00:00:00 2001 From: Tobias Mueller Date: Wed, 2 Sep 2009 15:41:48 +0200 Subject: [PATCH] Add a simple visualization script Inititally written by Daniel Siegel. It can plot graphs based on CSV data. Feel free to move this script to a more appropriate place. --- bin/membership-graph.py | 128 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 bin/membership-graph.py diff --git a/bin/membership-graph.py b/bin/membership-graph.py new file mode 100644 index 0000000..a20ee3d --- /dev/null +++ b/bin/membership-graph.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +''' +Simple script which takes CSV Data either from stdin or a given filename and plots a graph out of that. +You might want to retrieve CSV Data by executing the following command: + +mysql -h button-back -u anonvoting -p foundation -B -e 'SELECT DATE_FORMAT(first_added, "%Y-%m") AS date, COUNT(*) as joined FROM foundationmembers GROUP BY date;' | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' | awk 'FNR>1' + +mysql -h button-back -u anonvoting -p foundation -B -e "SET @start = '2009-01-01', @end = '2009-08-30'; SELECT DATE_FORMAT(DATE_ADD(last_renewed_on, INTERVAL 2 YEAR), '%Y-%m') as date, COUNT(*) as dropped_out FROM foundationmembers WHERE last_renewed_on >= DATE_SUB(@start, INTERVAL 2 YEAR) AND last_renewed_on <= DATE_SUB(@end, INTERVAL 2 YEAR) GROUP BY date;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' | awk 'FNR>1' +''' +import logging +import pylab +from pylab import figure, title, bar, xticks, yticks, gca, savefig +import sys + +plot_title = "New Foundation Members" +figwidth = 40 +figheight = 3 + +def bar_date_graph(name_value_dict, graph_title="", output_name="bargraph.png", show=False): + fig = figure( + #figsize=(figwidth, figheight) + ) + + title(graph_title, + #size="x-small" + ) + + sortedkeys, sortedvalues = zip(*sorted(zip(name_value_dict.keys(), + name_value_dict.values()), reverse=False)) + for i, value in zip(range(len(sortedvalues)), sortedvalues): + bar(i + 0.25, value, color="#73d216") + + pylab.xticks(pylab.arange(0.65, len(sortedkeys)), + [("%s: %d" % (name, value)) + for name, value in zip(sortedkeys, sortedvalues)], + #size="xx-large", + ) + + yticks( + #size="xx-large" + ) + + gca().yaxis.grid(which="major") + + fig.autofmt_xdate() + + savefig(output_name) + + if show: + pylab.show() + +def normalize(*args): + out = [] + for a in args: + cleaned = a.strip(' "') + #cleaned = int(a) + out.append(cleaned) + + return out + +if __name__=="__main__": + from optparse import OptionParser + parser = OptionParser("usage: %prog [options] INFILE") + parser.add_option("-l", "--loglevel", dest="loglevel", + help="Sets the loglevel to one of debug, info, warn," + " error, critical", default="error") + parser.add_option("-o", "--output", + dest="output", default="bargraph.png", + help="file to create with the plotted graph") + parser.add_option("-s", "--show", + dest="show", default="False", action="store_true", + help="display the graph after it has been drawn") + parser.add_option("-t", "--title", + dest="title", default="New Foundation Members", + help="set the title of the graph") + + (options, args) = parser.parse_args() + loglevel = {'debug': logging.DEBUG, 'info': logging.INFO, + 'warn': logging.WARN, 'error': logging.ERROR, + 'critical': logging.CRITICAL}.get(options.loglevel, "error") + logging.basicConfig(level=loglevel) + log = logging.getLogger("MembershipGraph Main") + + output_fname = options.output + + if len(args) > 0: + fname = args[0] + if fname == '-': + infile = sys.stdin + else: + infile = file(fname, 'r') + else: + path = sys.stdin + + + + + values = {} + date = None + first = None + + lines = infile.readlines() + for line in lines: + l = line.strip().split(",") + if l and l[0] and l[1]: + x, y = normalize(l[0], l[1]) + print x, y + if not first: + first = x + last = x + values[x] = int(y) + + date = first + while date != last: + year, month = date.split("-") + month = int(month) + year = int(year) + month += 1 + if month > 12: + month = 1 + year += 1 + + date = "-".join([str(year), str('%02d' % month)]) + + if date not in values: + values[date] = 0 + + bar_date_graph(values, options.title, output_fname, show=options.show)