Never been to DZone Snippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world

Plotting graph on pys60 (See related posts)

Here's the first step towards porting matplotlib to pys60.
I try to replicate some easy examples in
matplotlib tutorial.

First, we need a float range function.
from __future__ import generators

def arange(start, stop=None, step=None):
    if stop is None:
        stop = float(start)
        start = 0.0
    if step is None:
        step = 1.0
    cur = float(start)
    while cur < stop:
        yield cur
        cur += step

Then, a function to draw the axes and ticks.
In the future, this should be called automatically from plot().
from appuifw import *
app.body = canvas = Canvas()
width, height = canvas.size

def axes(xyrange, position=[18, height-11, width-10, 10], formatter=lambda x:x):
    global left, bottom, right, top, min_x, min_y, scale_x, scale_y
    left, bottom, right, top = position
    min_x, max_x, step_x, min_y, max_y, step_y = xyrange
    scale_x = float(right-left)/(max_x-min_x)
    scale_y = float(bottom-top)/(max_y-min_y)
    canvas.clear()
    canvas.rectangle([(left,top), (right+1, bottom+1)], 0)
    for x in arange(min_x, max_x, step_x):
        canvas.text((14+scale_x*(x-min_x), height-1), unicode(formatter(x)))
        canvas.point((left+scale_x*(x-min_x), bottom-1), 0)
        canvas.point((left+scale_x*(x-min_x), top+1), 0)
    for y in arange(min_y, max_y, step_y):
        canvas.text((2, bottom+2-scale_y*(y-min_y)), unicode(formatter(y)))
        canvas.point((left+1, bottom-scale_y*(y-min_y)), 0)
        canvas.point((right-1, bottom-scale_y*(y-min_y)), 0)

And lastly, the plot function. Now it has only a few features.
More will be added depending on what is needed.
def plot(xs, ys=None):
    if ys==None:
        ys = xs
        xs = range(len(ys))
    last = left+(xs[0]-min_x)*scale_x, bottom-(ys[0]-min_y)*scale_y
    for i in range(1, len(ys)):
        p = left+(xs[i]-min_x)*scale_x, bottom-(ys[i]-min_y)*scale_y
        canvas.line([last, p], 0x00000ff)
        last = p
    canvas.point(last, 0x0000ff)

When we want to plot a graph, we called both axes() and plot()
# a straight line
>>> axes([0,3.1,.5, 1,4.1,.5])
>>> plot([1,2,3,4])

# a parabola y = x^2
>>> axes([1,4.1,1, 0,16.1,2], formatter=int)
>>> plot([1,2,3,4], [1,4,9,16])

See the sreenshot of the first.


You need to create an account or log in to post comments to this site.


Click here to browse all 5140 code snippets

Related Posts