[foundation-web] Add a simple visualization script
- From: Tobias Mueller <tobiasmue src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [foundation-web] Add a simple visualization script
- Date: Thu, 3 Sep 2009 11:31:36 +0000 (UTC)
commit 044a449b46b91d8b74a1efa1bb482b4d5db5574f
Author: Tobias Mueller <tobiasmue gnome org>
Date: Wed Sep 2 15:41:48 2009 +0200
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 files changed, 128 insertions(+), 0 deletions(-)
---
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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]