Changeset 203
- Timestamp:
- 08/24/08 11:12:00 (3 months ago)
- Files:
-
- trunk/shakespeare/controllers/stats.py (modified) (1 diff)
- trunk/shakespeare/templates/stats/text.html (modified) (1 diff)
- trunk/shakespeare/templates/stats/word.html (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/shakespeare/controllers/stats.py
Revision 199 Revision 203 1 import logging 1 import logging 2 2 3 import pygooglechart 3 import pygooglechart 4 4 5 from shakespeare.lib.base import * 5 from shakespeare.lib.base import * 6 log = logging.getLogger(__name__) 6 log = logging.getLogger(__name__) 7 import shakespeare.stats 7 import shakespeare.stats 8 8 9 class StatsController(BaseController): 9 class 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>
