473,394 Members | 1,694 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,394 software developers and data experts.

Graphs/statistics using wxPython

Hello all,

I wanted to plot some statistics, so I wrote a simple wxPython class
to do it. Then I realized that I would like to draw bar graphs, so I
added that too.

Since I'm a complete Python newbie, I haven't done much of it the
"Python way", I suspect. So, I'm wondering if someone would like to show
me some of the tricks I should have used.

You can find the code at:
http://user.it.uu.se/~jada3673/drawtest.py

It's not finished[*], but it is usable. Oh, you can do whatever you
want with it. Since I had never touched wxPython before working with
this, I used some doodle application as a starting point.

Btw... Has anyone already written statistics classes for wxPython? If
so, where can I find them? If nothing similar exists, I'll probably add
support for loading data from a file, and a few other features. Feel
free to make requests or enhancements.
[*] There are some size/offset bugs which I am aware of, but they are
easily fixed. I just haven't got around to it yet.
Jul 19 '05 #1
8 5103
Jan Danielsson wrote:
Hello all,

I wanted to plot some statistics, so I wrote a simple wxPython class
to do it. Then I realized that I would like to draw bar graphs, so I
added that too.

Since I'm a complete Python newbie, I haven't done much of it the
"Python way", I suspect. So, I'm wondering if someone would like to show
me some of the tricks I should have used.


Trick #1:

import matplotlib

;-)

--
Robert Kern
rk***@ucsd.edu

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter

Jul 19 '05 #2
Robert Kern wrote:
I wanted to plot some statistics, so I wrote a simple wxPython class
to do it. Then I realized that I would like to draw bar graphs, so I
added that too.

Since I'm a complete Python newbie, I haven't done much of it the
"Python way", I suspect. So, I'm wondering if someone would like to show
me some of the tricks I should have used.

Trick #1:

import matplotlib


Oh. :-)

That's a pretty neat trick -- now can you make my embarrassment go away?

I did do a quick search to see if anyone had done anything similar;
but I guess I wasn't using the right keywords.
;-)


You may point and laugh.

Damn, that's a neat toolkit! Thanks for pointing me to it!
Jul 19 '05 #3
Jan Danielsson wrote:
Robert Kern wrote:

Trick #1:

import matplotlib


Oh. :-)

That's a pretty neat trick -- now can you make my embarrassment go away?

I did do a quick search to see if anyone had done anything similar;
but I guess I wasn't using the right keywords.
;-)


You may point and laugh.

Damn, that's a neat toolkit! Thanks for pointing me to it!


It's okay. Just about every Pythonista in the sciences has, at one time
or another, started a plotting library. It's a rite of passage. Welcome
to the club. :-)

--
Robert Kern
rk***@ucsd.edu

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter

Jul 19 '05 #4
Robert Kern wrote:
[---]
It's okay. Just about every Pythonista in the sciences has, at one time
or another, started a plotting library. It's a rite of passage. Welcome
to the club. :-)


Question: I need to install SciPy in order to use matplotlib, but on
the download page I see that there are versions for Python 2.2.x and
2.3.x. I use 2.4.1 -- will bad things happen if I try to use the build
for 2.3.x?
Jul 19 '05 #5
Jan Danielsson wrote:
Robert Kern wrote:
[---]
It's okay. Just about every Pythonista in the sciences has, at one time
or another, started a plotting library. It's a rite of passage. Welcome
to the club. :-)
Question: I need to install SciPy in order to use matplotlib,


No you don't.
but on
the download page I see that there are versions for Python 2.2.x and
2.3.x. I use 2.4.1 -- will bad things happen if I try to use the build
for 2.3.x?


Yes. Scipy has many extension modules; such modules built for 2.3.x
won't work for 2.4.x, etc.

--
Robert Kern
rk***@ucsd.edu

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter

Jul 19 '05 #6
Robert Kern wrote:
[---]
It's okay. Just about every Pythonista in the sciences has, at one time
or another, started a plotting library. It's a rite of passage. Welcome
to the club. :-)

Question: I need to install SciPy in order to use matplotlib,


No you don't.


Ah.. I misread. I read
http://matplotlib.sourceforge.net/installing.html, the section which
describes what "enthought python" contains, and thought it meant "this
is relevant to matplot lib".
but on
the download page I see that there are versions for Python 2.2.x and
2.3.x. I use 2.4.1 -- will bad things happen if I try to use the build
for 2.3.x?


Yes. Scipy has many extension modules; such modules built for 2.3.x
won't work for 2.4.x, etc.


So, for future reference: I should *never* mix x and y versions in
verion: x.y.z. I've wondered why there are versions of libraries for
different versions of Python..
Jul 19 '05 #7
Jan Danielsson wrote:
So, for future reference: I should *never* mix x and y versions in
verion: x.y.z. I've wondered why there are versions of libraries for
different versions of Python..


For packages with extension modules at least. Python maintains binary
compatibility between micro-releases (i.e. different z).

--
Robert Kern
rk***@ucsd.edu

"In the fields of hell where the grass grows high
Are the graves of dreams allowed to die."
-- Richard Harter

Jul 19 '05 #8
Jan Danielsson wrote:
Hello all,

I wanted to plot some statistics, so I wrote a simple wxPython class
to do it. Then I realized that I would like to draw bar graphs, so I
added that too.

Since I'm a complete Python newbie, I haven't done much of it the
"Python way", I suspect. So, I'm wondering if someone would like to show
me some of the tricks I should have used.

You can find the code at:
http://user.it.uu.se/~jada3673/drawtest.py

It's not finished[*], but it is usable. Oh, you can do whatever you
want with it. Since I had never touched wxPython before working with
this, I used some doodle application as a starting point.

Btw... Has anyone already written statistics classes for wxPython? If
so, where can I find them? If nothing similar exists, I'll probably add
support for loading data from a file, and a few other features. Feel
free to make requests or enhancements.

[*] There are some size/offset bugs which I am aware of, but they are
easily fixed. I just haven't got around to it yet.


If you ever want to add an extra dimension, then using OpenGL with
wxWindows is a breeze. See attached file for a 3d pie char..

Will McGugan

--
http://www.willmcgugan.com
"".join({'*':'@','^':'.'}.get(c,0) or chr(97+(ord(c)-84)%26) for c in
"jvyy*jvyyzpthtna^pbz")

# Pie Chart Window
# 2005 Will McGugan (wi**@willmcgugan.com)
import wx

from wx import glcanvas
from OpenGL.GL import *
import math
import time

sin = math.sin
cos = math.cos
PI = math.pi
def DegToRad(deg):
return deg*PI/180.

class PieSegment(object):

def __init__(self, radius, angle1, angle2, colour, depth):

self.display_list = glGenLists(1)

glNewList(self.display_list, GL_COMPILE)

self.angle1 = angle1
self.angle2 = angle2
self.explode_angle = DegToRad( (angle2 + angle1) / 2.)
DrawPieSegment(radius, angle1, angle2, colour, depth)

glEndList()

def __del__(self):
glDeleteLists(self.display_list, 1)

def Draw(self, angle1, angle2, explode):

glPushMatrix()

glRotate(angle1, 1.0, 0.0, 0.0);
glRotate(angle2, 0.0, 0.0, 1.0);

glTranslatef( sin(self.explode_angle)*explode, cos(self.explode_angle)*explode, 0. )

glCallList(self.display_list)
glPopMatrix()

def DrawPieSegment(radius, angle1, angle2, colour, depth):

angle1 = DegToRad(angle1)
angle2 = DegToRad(angle2)

# Number of divisions in 360 degrees
RES = 100.

fan2D = []

step_degree = ((2*PI)/RES)
step_count = int( (angle2 - angle1) / step_degree ) + 1

step_degree = ( angle2 - angle1 ) / float(step_count)
# Precalculate the trig
sina1 = sin(angle1)
cosa1 = cos(angle1)

sina2 = sin(angle2)
cosa2 = cos(angle2)

# Calculate the points in an arc
for p in xrange(step_count+1):

a = angle1 + p * step_degree

x = sin(a)
y = cos(a)

fan2D.append( (x,y) )

z1 = +depth/2.
z2 = -depth/2.

glMaterial(GL_FRONT, GL_DIFFUSE, [colour[0], colour[1], colour[2], 1.0])

# Create a fan for the top and bottom of the pie segment
glNormal(0, 0, +1.)
glBegin(GL_TRIANGLE_FAN)
glVertex(0, 0, z1)
for x, y in fan2D:
glVertex(x*radius, y*radius, z1)
glEnd()

glNormal(0, 0, -1.)
glBegin(GL_TRIANGLE_FAN)
glVertex(0, 0, z2)
for x, y in fan2D:
glVertex(x*radius, y*radius, z2)
glEnd()

# A strip for the curved edge
glBegin(GL_TRIANGLE_STRIP)
for x, y in fan2D:
glNormal(x, y, 0.)
xr = x * radius
yr = y * radius
glVertex(xr, yr, z1)
glVertex(xr, yr, z2)
glEnd()
n1 = -cosa1, sina1, 0.
n2 = cosa2, -sina2, 0.

x1, y1 = sina1 * radius, cosa1 * radius
x2, y2 = sina2 * radius, cosa2 * radius
# Two quads for the radius edges

glNormal(n1)
glBegin(GL_QUADS)

glVertex(0, 0, z1)
glVertex(x1, y1, z1)
glVertex(x1, y1, z2)
glVertex(0, 0, z2)

glEnd()

glNormal(n2)
glBegin(GL_QUADS)

glVertex(0, 0, z1)
glVertex(x2, y2, z1)
glVertex(x2, y2, z2)
glVertex(0, 0, z2)

glEnd()

class PieChartWindow(glcanvas.GLCanvas):
def __init__(self, parent):

attriblist = None
glcanvas.GLCanvas.__init__(self, parent, -1, wx.DefaultPosition, wx.DefaultSize, 0, "GLCanvas", attriblist, wx.NullPalette)

self.init = False

self.segments = []
self.animating = False
self.angle = 0.
self.explode = 0.

self.downx = 0
self.rot = 0.

self.captured_mouse = False

self.timer = wx.Timer(self)

self.Bind(wx.EVT_TIMER, self.OnTimer)
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftButtonDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftButtonUp)
self.Bind(wx.EVT_MOTION, self.OnMouseMove)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_PAINT, self.OnPaint)

def Animate(self):
self.animating = True
self.start_animate = time.clock()
self.timer.Start(1000/20)
def OnTimer(self, event):
if self.IsShown():
self.Refresh()
if not self.animating:
self.timer.Stop();
def SetSegments(self, segments, angle=0., radius=150., depth=50.):

self.segments = []

First = True

if len(segments):
angle = -(segments[0][0]/2. *360./100.)

for seg in segments:

seg_percent, colour = seg

if seg_percent == 0:
continue

if seg_percent < .2:
angle = angle + (seg_percent*360./100.)
continue

if First:
angle = -(seg_percent/2. * 360./100.)
First = False

next_angle = angle + (seg_percent*360./100.)
self.segments.append(PieSegment(radius, angle, next_angle, colour, depth))
angle=next_angle

def PerspectiveProjection(self):

w, h = 300., 300.
a = 30.

tana = math.tan(DegToRad(a/2.))

glMatrixMode(GL_PROJECTION);

v = (w/2) / tana

near = v / 10.

vw = tana * near
vh = tana * near

glFrustum(-vw, vw, -vh, vh, near, v*3.0);

glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0, 0.0, -v*1.2);

glLight(GL_LIGHT0, GL_POSITION, [w/2, h/2, v*1.2, 0.0]);

def InitGL(self):

self.PerspectiveProjection()

glMaterial(GL_FRONT, GL_AMBIENT, [0.3, 0.3, 0.3, 1.0])
glMaterial(GL_FRONT, GL_DIFFUSE, [0.9, 0.9, 0.9, 1.0])
glMaterial(GL_FRONT, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
glMaterial(GL_FRONT, GL_SHININESS, 70.0)
glLight(GL_LIGHT0, GL_AMBIENT, [0.25, 0.25, 0.25, 1.0])
glLight(GL_LIGHT0, GL_DIFFUSE, [1.0, 1.0, 1.0, 1.0])
glLight(GL_LIGHT0, GL_SPECULAR, [.1, .1, .1, 1.0])

glLightModel(GL_LIGHT_MODEL_AMBIENT, [0.2, 0.2, 0.2, 1.0])
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)

glClearColor(1,1,1,1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_MODELVIEW);
def OnLeftButtonDown(self, event):
self.downx = event.GetPosition()[0]
self.captured_mouse = True
self.CaptureMouse()

def OnLeftButtonUp(self, event):
if self.captured_mouse and self.HasCapture():
self.ReleaseMouse()

def OnMouseMove(self, event):
if event.Dragging() and event.LeftIsDown():
mx, my = event.GetPosition()
rot_delta = self.downx - mx
self.rot+= rot_delta
self.downx = mx
self.Refresh()

def OnEraseBackground(self, event):
pass
def OnSize(self, event):
size = self.GetClientSize()
if self.GetContext():
self.SetCurrent()
glViewport(0, 0, size.width, size.height)
self.Refresh()
event.Skip()

def OnPaint(self, event):
dc = wx.PaintDC(self)
self.SetCurrent()
if not self.init:
self.InitGL()
self.init = True

self.OnDraw()
def OnDraw(self):

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if self.animating:

t = time.clock() - self.start_animate
if t < 1.:
self.angle = 0.
self.explode = 0.
elif t < 2.:
ts = t - 1.
self.angle = -50. * ts
elif t < 3.:
ts = t - 2.
self.angle = -50.
self.explode = 15. * ts
else:
self.animating = False
self.angle = -50.
self.explode = 15.

for segment in self.segments:

segment.Draw(self.angle, self.rot, self.explode)

self.SwapBuffers()

if __name__ == "__main__":

class TestFrame(wx.Frame):
def __init__(self):
super(TestFrame, self).__init__(None, -1, "Pie Chart Test", style=wx.DEFAULT_FRAME_STYLE)
self.SetClientSize(wx.Size(300,300))

pie_chart = PieChartWindow(self)

# List of tuples ( <Percentage of Pie>, ( <Red>, <Green>, <Blue> ) )
seg = [ ( 20, (1., 0.1, 0.1) ),
( 25, (0.05, .9, .1) ),
( 10, (.2, 0.1, 1.) ),
( 30, (.8, .9, .1) ) ]

pie_chart.SetSegments( seg )
pie_chart.Animate()

app = wx.App()
frame = TestFrame()
frame.Show(True)
app.MainLoop()
Jul 19 '05 #9

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

5
by: Mark Fenbers | last post by:
I am investigating Python for the sake of ultimately generating hydrographs (such as this: http://ahps.erh.noaa.gov/iln/ahps/RiverDat/gifs/prgo1.png) on-the-fly from a web server cluster. I have...
9
by: rhmd | last post by:
I need to create image files (eg bmp or jpeg) of xy scatter graphs (i.e., graphs in which markers denote individual points; the markers need to be small polygons of various sizes, shapes, colors,...
12
by: | last post by:
I've trolled the lists, FAQs, and Net as a whole, but can't find anything definitive to answer this. We're looking for real-time graph capability (bar, line, etc), so that we can display...
3
by: Kenneth McDonald | last post by:
If this is not an appropriate newsgroup for this type of posting, please let me know and (if possible) suggest an alternative. I've done a fair bit of research on the net, but information is...
16
by: David Lauberts | last post by:
Hi Wonder if someone has some words of wisdom. I have a access 2002 form that contains 2 graph objects that overlay each other and would like to export them as a JPEG to use in a presentation....
0
by: Ray Mitchell | last post by:
Hello, I need to write an application that displays multiple graphs on multiple tabbed sheets in a single window. The graphs are all simple X-Y line graphs like you'd see on an oscilloscope,...
17
by: romixnews | last post by:
Hi, I'm facing the problem of analyzing a memory allocation dynamic and object creation dynamics of a very big C++ application with a goal of optimizing its performance and eventually also...
7
by: Heiko Niedermeyer | last post by:
Sorry for the fuzzy subject... Currently I'm writing a little programm to extract some chemical information out of a text file, and then present it in a pleasant way. The Extraction works so...
1
by: Antoninus Twink | last post by:
On 9 Nov 2008 at 9:34, marlow.andrew@googlemail.com wrote: Speaking for myself... I haven't downloaded your project because I've never heard of it. Generally, until a package makes it into my...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.