Done. See http://www.web2pyslices.com/main/slices/take_slice/79
On May 15, 8:44 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > Would you make a web2pyslice of this with some screenshots? Looks like > great work. > > -- > Thadeus > > On Sat, May 15, 2010 at 5:09 PM, MikeEllis <michael.f.el...@gmail.com> wrote: > > Thanks, Thaddeus. That's a good suggestion. It turns out my case can > > be simplified considerably by using explicit id's for the sparklines, > > e.g. > > > $(function() { > > $(this).everyTime(1000,function(i) { > > $.getJSON('/peertool/sparkline/call/json/sparkdata/ > > 13/0/20', function(data) { > > $("#dynbar0").sparkline(data.dynbar0, {type: 'bar', > > barColor: 'green'}); > > $("#dynbar1").sparkline(data.dynbar1, {type: 'bar', > > barColor: 'green'}); > > // etc ... > > }); > > }); > > }); > > > This works because I know how many plots will be needed when the page > > is rendered by the view, so it's fairly trivial to generate the > > necessary id's server side. If I were doing something that required > > consulting a different server to get the data for each plot, then I'd > > certainly look seriously at writing a plugin. > > > In case it's useful to anyone else, here's a complete working example > > that's kind of fun to see in action. When you browse to the index > > page, it puts up between 5 and 25 bar graphs with random values > > reverse sorted to emulate Pareto charts. The charts update once per > > second with new data from the server. > > > (WARNING - a few minutes of this drives my MacBook's cpu usage up > > because I don't have indexing turned off for wherever the json data is > > going.) > > > 1. web2py_ajax.html - add the sparkline and timer plugins > > > response.files.insert(4,URL(r=request,c='static',f='jquery.sparkline.js')) > > response.files.insert(5,URL(r=request,c='static',f='jquery.timers-1.2.js')) > > > 2. The controller > > > # coding: utf8 > > import sys > > import random > > def index(): > > ngraphs = random.choice(range(5,25)) > > return dict(message="hello from sparkline.py", ngraphs=ngraphs, > > chartmin=0, chartmax=20) > > > def call(): > > session.forget() > > return service() > > > @service.json > > def sparkdata(ngraphs,chartmin,chartmax): > > ngraphs = int(ngraphs) > > chartmin = int(chartmin) > > chartmax = int(chartmax) > > sys.stderr.write("\nsparkdata() called with ngraphs=%d\n"%ngraphs) > > d = dict() > > for n in xrange(ngraphs): > > id = "dynbar" + str(n) > > ## data for bar graph. 9 random ints between chartmax and > > chartmin > > data = [random.choice(range(chartmin,chartmax)) for i in > > xrange(9)] > > ## simulate a Pareto plot > > data.sort() > > data.reverse() > > d[id] = data > > sys.stderr.write("\n%s : %s"%(id, str(d[id]))) > > return d > > > 3. The view (index.html) > > > {{extend 'layout.html'}} > > {{ > > chartoptions = "{type: 'bar', barColor: 'green', 'chartRangeMin': > > '%d', 'chartRangeMax': '%d'}"%(chartmin,chartmax) > > jsonurl = URL(r=request,f='call/json/sparkdata/%(ngraphs)d/% > > (chartmin)d/%(chartmax)d'%locals()) > > }} > > <script type="text/javascript"> > > /* <![CDATA[ */ > > $(function() { > > $(this).everyTime(1000,function(i) { > > $.getJSON('{{=jsonurl}}', function(data) { > > {{for n in xrange(ngraphs):}} > > $("#dynbar{{=n}}").sparkline(data.dynbar{{=n}}, > > {{=chartoptions}}); > > {{pass}} > > }); > > }); > > }); > > /* ]]> */ > > </script> > > <h1>This is the sparkline.html template</h1> > > {{for n in xrange(ngraphs):}} > > <p> > > Bar chart with dynamic data: <span id="dynbar{{=n}}" > > class="dynamicbar">Loading..</span> > > </p> > > {{pass}} > > {{=BEAUTIFY(response._vars)}} > > > That's it. BTW, sparkline charts are really useful in applications > > where you need to visually compare lots of similar data series. Here's > > a link to a chapter in Edward Tufte's "Beautiful Evidence" with more > > info > > >http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR > > > The JQuery Sparklines plug-in page is also useful. > > >http://omnipotent.net/jquery.sparkline/ > > > Cheers, > > Mike > > > On May 15, 3:27 pm, Thadeus Burgess <thade...@thadeusb.com> wrote: > >> For multiple elements you might want to try and put it into a jQuery > >> plugin, allowing you to re-use the code for each sparkline. > > >> $(".spark").makeSparkline({url:/path/to/call/sparkdata, args:etc}); > > >> -- > >> Thadeus > > >> On Sat, May 15, 2010 at 1:34 PM, MikeEllis <michael.f.el...@gmail.com> > >> wrote: > > >> > After spending some time with Firebug to find and fix a couple of > >> > typos, I've got it working now. There seems to be no way around > >> > explicitly referring to the SPAN element (see below), but I can live > >> > with that. > > >> > Now I need to tackle the next level, which is to expand the server- > >> > side JSON function to return data for multiple sparklines on a page > >> > and arrange to call sparkline() with the right data for each of the > >> > corresponding elements. > > >> > Thanks again for the help! > > >> > Here's what's working correctly: > > >> > In the view ... > > >> > <script type="text/javascript"> > >> > /* <![CDATA[ */ > >> > $(function() { > >> > $('.dynamicsparkline').everyTime(1000,function(i) { > >> > var j = 2+i%5; > >> > $.getJSON('{{=URL(r=request,f='call/json/ > >> > sparkdata')}}/'+j, function(data) { > >> > var sparkdata = [10,9,8,7,6,5,4]; > >> > for(var k=0; k<sparkdata.length; k++) { sparkdata[k] = > >> > data.a[k];} > >> > console.log("sparkdata = " + sparkdata); > >> > $('.dynamicsparkline').sparkline(sparkdata); // WORKS > >> > // $(this).sparkline(sparkdata) // DOES NOT WORK! > >> > }); > >> > }); > >> > }); > >> > /* ]]> */ > >> > </script> > > >> > <h1>This is the sparkline.html template</h1> > >> > <p> > >> > Sparkline with dynamic data: <span class="dynamicsparkline">Loading..</ > >> > span> > >> > </ > >> > p> > > >> > and in the controller ... > > >> > @service.json > >> > def sparkdata(j): > >> > sys.stderr.write("\nsparkdata() called with j=%d\n"%int(j)) > >> > j = int(j) > >> > return dict(a=[n%j for n in [10,9,8,7,6,5,4]]) > > >> > Cheers, > >> > Mike > > >> > On May 14, 9:51 pm, mdipierro <mdipie...@cs.depaul.edu> wrote: > >> >> aha try replace > > >> >> $(function() { > >> >> $('.dynamicsparkline').everyTime(1000,function(i) { > >> >> $.getJSON('{{=URL(r=request,f='call/json/ > >> >> datapoints')}}/'+i, function(data) { > >> >> var b = [0,0,0,0,0,0,0] > >> >> var j = 2+i%5; > >> >> for(var k=0; k<b.length; k++) { b[k] = data.a[k] > >> >> %j;} > >> >> $(this).sparkline(b); > >> >> }); > >> >> }); > >> >> }); > > >> >> with > > >> >> $(function() { > >> >> $('.dynamicsparkline').each(function(index){ > >> >> var obj=$(this); > >> >> obj.everyTime(1000,function(i) { > >> >> $.getJSON('{{=URL(r=request,f='call/json/ > >> >> datapoints')}}/'+i, function(data) { > >> >> var b = [0,0,0,0,0,0,0] > >> >> var j = 2+i%5; > >> >> for(var k=0; k<b.length; k++) { b[k] = data.a[k] %j;} > >> >> obj.sparkline(b); > >> >> }); > >> >> }); > >> >> }); > >> >> }); > >