Changeset 203

Show
Ignore:
Timestamp:
08/24/08 11:12:00 (3 months ago)
Author:
rgrp
Message:

[shakespeare/stats][s]: bugfixes to stats WUI to get it looking nice and word chart working.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/shakespeare/controllers/stats.py

    Revision 199 Revision 203
    1import logging 1import logging 
    2 2 
    3import pygooglechart 3import pygooglechart 
    4 4 
    5from shakespeare.lib.base import * 5from shakespeare.lib.base import * 
    6log = logging.getLogger(__name__) 6log = logging.getLogger(__name__) 
    7import shakespeare.stats 7import shakespeare.stats 
    8 8 
    9class StatsController(BaseController): 9class StatsController(BaseController): 
    10 10 
    11    def index(self): 11    def index(self): 
    12        return render('stats/index') 12        return render('stats/index') 
    13 13 
    14    def text_index(self): 14    def text_index(self): 
    15        # only get those texts with stats 15        # only get those texts with stats 
    16        c.texts = model.Material.query.all() 16        c.texts = model.Material.query.all() 
    17        import shakespeare.controllers.text 17        import shakespeare.controllers.text 
    18        ctrl = shakespeare.controllers.text.TextController() 18        ctrl = shakespeare.controllers.text.TextController() 
    19        return ctrl.index() 19        return ctrl.index() 
    20 20 
    21    def text(self, id): 21    def text(self, id): 
    22        text_name = id 22        text_name = id 
    23        text = model.Material.byName(text_name) 23        text = model.Material.byName(text_name) 
    24        # no id or no text by that id 24        # no id or no text by that id 
    25        if not text: 25        if not text: 
    26            return self.text_index() 26            return self.text_index() 
    27        stats = shakespeare.stats.Stats() 27        stats = shakespeare.stats.Stats() 
    28        c.text = text 28        c.text = text 
    29        c.stats = stats.text_stats(text) 29        c.stats = stats.text_stats(text) 
    30        # 40 seems limit for google 30        # 40 seems limit for google 
    31        data = [ (s.word, s.freq) for s in c.stats[:40] ] 31        data = [ (s.word, s.freq) for s in c.stats[:40] ] 
    32        c.img_url = self.vertical_bar_chart(data) 32        c.img_url = self.vertical_bar_chart(data) 
    33        return render('stats/text') 33        return render('stats/text') 
    34 34 
    35    def word_index(self): 35    def word_index(self): 
    36        return '' 36        return '' 
    37     37     
    38    def word(self, id): 38    def word(self, id): 
    39        if id is None: 39        if id is None: 
    40            return self.word_index() 40            return self.word_index() 
    41        word = id 41        word = id 
    42        c.word = word 42        c.word = word 
    43        stats = shakespeare.stats.Stats() 43        stats = shakespeare.stats.Stats() 
    44        c.stats = stats.word_stats(word) 44        c.stats = stats.word_stats(word) 
    45        # will not have that many texts so do not need to limit c.stats 45        # will not have that many texts so do not need to limit c.stats 
    46        data = [ (s.text.title, s.freq) for s in c.stats ] 46        data = [ (s.text.title[:min(len(s.text.title), 10)], s.freq) for s in c.stats ] 
    47        c.img_url = self.vertical_bar_chart(data) 47        c.img_url = self.vertical_bar_chart(data) 
    48        return render('stats/word') 48        return render('stats/word') 
    49 49 
    50    # TODO: factor this out to its module (?) 50    # TODO: factor this out to its module (?) 
    51    def vertical_bar_chart(self, data, width=500): 51    def vertical_bar_chart(self, data, width=300): 
    52        if not data: 52        if not data: 
    53            return '' 53            return '' 
    54        # tranpose 54        # tranpose 
    55        tdata = zip(*data) 55        tdata = zip(*data) 
    56        labels = list(tdata[0]) 56        labels = list(tdata[0]) 
    57        values = tdata[1] 57        values = tdata[1] 
    58        bar_width = 10 58        bar_width = 10 
    59        # add 5 for space between bars 59        # add 5 for space between bars 
    60        height = (bar_width + 5) * len(values) 60        height = (bar_width + 5) * len(values) 
    61        # was setting x_range but automatic behaviour seems better 61        # was setting x_range but automatic behaviour seems better 
    62        # x_range = (min(values), max(values)) 62        # x_range = (min(values), max(values)) 
    63        chart = pygooglechart.StackedHorizontalBarChart(width, height) 63        chart = pygooglechart.StackedHorizontalBarChart(width, height) 
    64        chart.set_bar_width(bar_width) 64        chart.set_bar_width(bar_width) 
    65        chart.set_colours(['cc0033']) 65        chart.set_colours(['cc0033']) 
    66        chart.add_data(values) 66        chart.add_data(values) 
    67        # have to reverse the labels for vertical 67        # have to reverse the labels for vertical 
    68        labels.reverse() 68        labels.reverse() 
    69        chart.set_axis_labels(pygooglechart.Axis.LEFT, labels) 69        chart.set_axis_labels(pygooglechart.Axis.LEFT, labels) 
    70        chart.set_axis_range(pygooglechart.Axis.BOTTOM, 0, max(values)) 70        chart.set_axis_range(pygooglechart.Axis.BOTTOM, 0, max(values)) 
    71        chart.set_axis_range(pygooglechart.Axis.TOP, 0, max(values)) 71        chart.set_axis_range(pygooglechart.Axis.TOP, 0, max(values)) 
    72        url = chart.get_url() 72        url = chart.get_url() 
    73        return url 73        return url 
    74 74 
  • trunk/shakespeare/templates/stats/text.html

    Revision 199 Revision 203
    1<html xmlns:py="http://genshi.edgewall.org/" 1<html xmlns:py="http://genshi.edgewall.org/" 
    2  xmlns:xi="http://www.w3.org/2001/XInclude"> 2  xmlns:xi="http://www.w3.org/2001/XInclude"> 
    3   3   
    4  <py:def function="page_title">Stats for ${c.text.title}</py:def> 4  <py:def function="page_title">Stats for ${c.text.title}</py:def> 
    5 5 
    6  <div py:match="content"> 6  <div py:match="content"> 
    7    <img style="float: left;" 7    <img style="float: left;" 
    8      src="${c.img_url}" 8      src="${c.img_url}" 
    9      alt="Word Statistics Bar Chart" /> 9      alt="Word Statistics Bar Chart" /> 
    10 10 
    11    <p py:if="not c.stats"> 11    <p py:if="not c.stats"> 
    12      Sorry, no statistics are available for ${c.text.title} (name: ${c.text.name}) 12      Sorry, no statistics are available for ${c.text.title} (name: ${c.text.name}) 
    13    </p> 13    </p> 
    14    <table style="margin-left: 550px;"14    <table
    15    <thead> 15    <thead> 
    16      <tr> 16      <tr> 
    17        <th>Index</th> 17        <th>Index</th> 
    18        <th> 18        <th> 
    19          Word   19          Word   
    20        </th> 20        </th> 
    21        <th> 21        <th> 
    22          Frequency 22          Frequency 
    23        </th> 23        </th> 
    24      </tr> 24      </tr> 
    25    </thead> 25    </thead> 
    26    <tbody> 26    <tbody> 
    27      <tr py:for="index, stat in enumerate(c.stats)"> 27      <tr py:for="index, stat in enumerate(c.stats)"> 
    28        <td> 28        <td> 
    29          ${index + 1} 29          ${index + 1} 
    30        </td> 30        </td> 
    31        <td> 31        <td> 
    32          ${stat.word} 32          ${stat.word} 
    33        </td> 33        </td> 
    34        <td> 34        <td> 
    35          ${stat.freq} 35          ${stat.freq} 
    36        </td> 36        </td> 
    37      </tr> 37      </tr> 
    38    </tbody> 38    </tbody> 
    39    </table> 39    </table> 
    40  </div> 40  </div> 
    41 41 
    42  <xi:include href="../layout.html" /> 42  <xi:include href="../layout.html" /> 
    43</html> 43</html> 
  • trunk/shakespeare/templates/stats/word.html

    Revision 199 Revision 203
    1<html xmlns:py="http://genshi.edgewall.org/" 1<html xmlns:py="http://genshi.edgewall.org/" 
    2  xmlns:xi="http://www.w3.org/2001/XInclude"> 2  xmlns:xi="http://www.w3.org/2001/XInclude"> 
    3   3   
    4  <py:def function="page_title">Stats for '${c.word}'</py:def> 4  <py:def function="page_title">Stats for '${c.word}'</py:def> 
    5 5 
    6  <div py:match="content"> 6  <div py:match="content"> 
    7    <img style="float: left;" 7    <img style="float: left;" 
    8      src="${c.img_url}" 8      src="${c.img_url}" 
    9      alt="Word Statistics Bar Chart" /> 9      alt="Word Statistics Bar Chart" /> 
    10 10 
    11    <p py:if="not c.stats"> 11    <p py:if="not c.stats"> 
    12      Sorry, no statistics are available for ${c.text.title} (name: ${c.text.name}) 12      Sorry, no statistics are available for ${c.word} (NB: words are stemmed for stats purposes, so loved becomes love, bloody becomes blood etc). 
    13    </p> 13    </p> 
    14    <table style="margin-left: 550px;"14               <table
    15    <thead> 15    <thead> 
    16      <tr> 16      <tr> 
    17        <th>Index</th> 17        <th>Index</th> 
    18        <th> 18        <th> 
    19          Text 19          Text 
    20        </th> 20        </th> 
    21        <th> 21        <th> 
    22          Frequency 22          Frequency 
    23        </th> 23        </th> 
    24      </tr> 24      </tr> 
    25    </thead> 25    </thead> 
    26    <tbody> 26    <tbody> 
    27      <tr py:for="index, stat in enumerate(c.stats)"> 27      <tr py:for="index, stat in enumerate(c.stats)"> 
    28        <td> 28        <td> 
    29          ${index + 1} 29          ${index + 1} 
    30        </td> 30        </td> 
    31        <td> 31        <td> 
    32          ${stat.text.title} 32          ${stat.text.title} 
    33        </td> 33        </td> 
    34        <td> 34        <td> 
    35          ${stat.freq} 35          ${stat.freq} 
    36        </td> 36        </td> 
    37      </tr> 37      </tr> 
    38    </tbody> 38    </tbody> 
    39    </table> 39    </table> 
    40  </div> 40  </div> 
    41 41 
    42  <xi:include href="../layout.html" /> 42  <xi:include href="../layout.html" /> 
    43</html> 43</html>