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);
>> >>               });
>> >>           });
>> >>         });
>> >>     });
>>
>>
>

Reply via email to