Hi folks,
I just created a tiny prototype of an 'oscilloscope'. I get live data from a
robot via UDP. My network class calls the update() of the oscilloscope. The
oscilloscope is part of an existing GTK app which runs on an Ubuntu.
I have three questions:
1) Since it's my first animation with matplotlib I'm not sure if this is really
the best way to do it (probably not :)). I especially dislike the creation of
np.array which could take a bit once I have a lot of data.
2) Is the integration in a GTK app like it is now ok or is there a better way?
I don't want to loose the zoom and move ability of the standard plot figure
though. And I need fast results so I don't want to spent to much time
tweaking this.
3) I get a *weird* X error when calling the update method from the network
class which probably doesn't have to do anything with matplotlib but I'm
asking anyway
robocup@...3096...:~/fumanoid/Desktop-Debug-YUV422$ ../install.py
/usr/lib/pymodules/python2.6/matplotlib/backends/backend_gtk.py:621:
DeprecationWarning: Use the new widget gtk.Tooltip
test from 0: 254/508
The program 'install.py' received an X Window System error.
This probably reflects a bug in the program.
The error was 'RenderBadPicture (invalid Picture parameter)'.
(Details: serial 11627 error_code 158 request_code 148 minor_code 7)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)
Sometimes it crashes instantly, sometimes it works for a few calls.
Calling update() from the interactive shell works fine though and displays
everything. So I don't know if it's really X like the error message
suggests or what. Did anybody of you experience something like this?
This is the oscilloscope:
import numpy as np
import matplotlib
#matplotlib.use('GTKAgg') # do this before importing pylab
# does not really change anything
import pylab
import matplotlib.pyplot as plt
class Oscilloscope():
def __init__(self):
# var for a moving window; not implemented yet
self.NO_OF_DATA_TO_PLOT = 0
plt.ion()
self.fig = plt.figure()
self.ax = self.fig.add_subplot(111)
self.ax.grid()
# list of raw data
self.raw_data_x = []
self.raw_data_y = []
self.graph_lim = dict(x_min=None, x_max=None,
y_min=None, y_max=None)
# get line of data to be able to extend it later
self.line, = self.ax.plot(np.array(self.raw_data_x),
np.array(self.raw_data_y))
# open the figure window
self.fig.canvas.draw()
def update(self, x, y):
"""Draw new data consisting of x and y."""
print 'in update'
self.raw_data_x.append(x)
self.raw_data_y.append(y)
# add new data
self.line.set_xdata(np.array( self.raw_data_x))
self.line.set_ydata(np.array(self.raw_data_y))
# redraw the canvas
self._limit_plot(x, y)
self.fig.canvas.draw()
Best,
Stefan