Nice :)
--
Thadeus




On Sat, May 15, 2010 at 10:50 PM, MikeEllis <michael.f.el...@gmail.com> wrote:
> 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);
>> >> >>               });
>> >> >>           });
>> >> >>         });
>> >> >>     });
>>
>>
>

Reply via email to