[foundation-web] Add a simple visualization script



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]