Hello,
I read a simple data stream from my computers serial port. I can nicely read the data using pyserial library but couldn’t get it nicely working neither with WXAgg nor Qt4Agg using the following code. Although with WX I could get updated looks, the figure isn’t very responsive in this way. I have looked at simple_idle_wx example but for some reason I can’t make it work to update the canvas whenever the condition satisfied.
What is the trick to make the real-time data plotted on the screen easily without blocking the figure itself?
import serial
import matplotlib.pyplot as plt
plt.ion()
ser = serial.Serial(0)
conc = []
while True:
s = ser.readline()
if s.startswith(‘CONC’):
conc.append(float(s.split()[2]))
plt.plot(conc)
plt.show()
plt.clf()
ser.close()
···
–
Gökhan
I’ve done this successfully with both the Qt4 and WX Agg backends. The part you care about is the update method.
Here’s the snippet I use for Qt. It shouldn’t change except for your imports at the top if you’re using Wx. Note, I’ve trimmed this down a bit, so hopefully I didn’t trim out anything important:
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
class PlotWidget(QWidget):
def __init__(self, parent):
QWidget.__init__(self, parent)
self.dpi=72
self.figure = Figure(dpi=self.dpi, linewidth=3)
self.canvas = FigureCanvas(self.figure)
self.canvas.setParent(self)
[self.ax](http://self.ax) = self.figure.add_subplot(111)
(self.__times, self.__temps) = ([], [])
self.background = self.canvas.copy_from_bbox(self.ax.bbox)
self.plotting_line = self.ax.plot([], color='red', lw=2)[0]
def update(self, temp, secs):
try:
self.__times.append(secs)
self.__temps.append(temp)
self.canvas.restore_region(self.background)
self.plotting_line.set_xdata(self.__times)
self.plotting_line.set_ydata(self.__temps)
self.ax.draw_artist(self.plotting_line)
self.canvas.blit(self.ax.bbox)
except IndexError:
pass
self.canvas.draw()
···
On Fri, Mar 12, 2010 at 12:36 PM, Gökhan Sever <gokhansever@…287…> wrote:
Hello,
I read a simple data stream from my computers serial port. I can nicely read the data using pyserial library but couldn’t get it nicely working neither with WXAgg nor Qt4Agg using the following code. Although with WX I could get updated looks, the figure isn’t very responsive in this way. I have looked at simple_idle_wx example but for some reason I can’t make it work to update the canvas whenever the condition satisfied.
What is the trick to make the real-time data plotted on the screen easily without blocking the figure itself?
import serial
import matplotlib.pyplot as plt
plt.ion()
ser = serial.Serial(0)
conc =
while True:
s = ser.readline()
if s.startswith(‘CONC’):
conc.append(float(s.split()[2]))
plt.plot(conc)
plt.show()
plt.clf()
ser.close()
–
Gökhan
Download Intel® Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users