Changeset 193

Show
Ignore:
Timestamp:
08/18/08 21:16:35 (11 months ago)
Author:
rgrp
Message:

[shakespeare/stats][m]: add charting to support to text stats page using pygooglechart.

Location:
trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/setup.py

    r155 r193  
    2121        'SQLObject>=0.6', 
    2222        'Genshi>=0.3', 
    23         'annotater>=0.1', 
     23        'pygooglechart>=0.2,<0.3', 
     24        # 'annotater>=0.1', 
    2425        ], 
    2526    test_suite='nose.collector', 
  • trunk/shakespeare/controllers/stats.py

    r187 r193  
    11import logging 
    22 
     3import pygooglechart 
     4 
    35from shakespeare.lib.base import * 
    4  
    56log = logging.getLogger(__name__) 
    6  
    77import shakespeare.stats 
    88 
     
    1818        c.text = text 
    1919        c.stats = stats.text_stats(text) 
     20        # 40 seems limit for google 
     21        data = [ (s.word, s.freq) for s in c.stats[:40] ] 
     22        c.img_url = self.vertical_bar_chart(data) 
    2023        return render('stats/text') 
    2124 
     25    # TODO: factor this out to its module (?) 
     26    def vertical_bar_chart(self, data, width=500): 
     27        # tranpose 
     28        tdata = zip(*data) 
     29        labels = list(tdata[0]) 
     30        values = tdata[1] 
     31        bar_width = 10 
     32        # add 5 for space between bars 
     33        height = (bar_width + 5) * len(values) 
     34        # was setting x_range but automatic behaviour seems better 
     35        # x_range = (min(values), max(values)) 
     36        chart = pygooglechart.StackedHorizontalBarChart(width, height) 
     37        chart.set_bar_width(bar_width) 
     38        chart.set_colours(['cc0033']) 
     39        chart.add_data(values) 
     40        # have to reverse the labels for vertical 
     41        labels.reverse() 
     42        chart.set_axis_labels(pygooglechart.Axis.LEFT, labels) 
     43        chart.set_axis_range(pygooglechart.Axis.BOTTOM, 0, max(values)) 
     44        chart.set_axis_range(pygooglechart.Axis.TOP, 0, max(values)) 
     45        url = chart.get_url() 
     46        return url 
     47 
  • trunk/shakespeare/templates/layout.html

    r181 r193  
    5959      <li><a href="${h.url_for(controller='text', action='index')}">Texts</a></li> 
    6060      <li><a href="${h.url_for(controller='search', action='index')}">Search</a></li> 
     61      <li><a href="${h.url_for(controller='stats', action='index')}">Stats</a></li> 
    6162      <li><a href="${h.url_for(controller='site', action='guide')}">Guide</a></li> 
    6263    </ul> 
  • trunk/shakespeare/templates/stats/text.html

    r187 r193  
    22  xmlns:xi="http://www.w3.org/2001/XInclude"> 
    33   
    4   <py:def function="page_title">Stats for ${c.text.name}</py:def> 
     4  <py:def function="page_title">Stats for ${c.text.title}</py:def> 
    55 
    66  <div py:match="content"> 
    7     <table border="1"> 
     7    <img style="float: left;" 
     8      src="${c.img_url}" 
     9      alt="Word Statistics Bar Chart" /> 
     10 
     11    <table border="1" style="margin-left: 550px;"> 
    812    <thead> 
    913      <tr> 
     14        <th>Index</th> 
    1015        <th> 
    1116          Word   
     
    1722    </thead> 
    1823    <tbody> 
    19       <tr py:for="stat in c.stats"> 
     24      <tr py:for="index, stat in enumerate(c.stats)"> 
     25        <td> 
     26          ${index + 1} 
     27        </td> 
    2028        <td> 
    2129          ${stat.word}