Hi Darren

thanks for the quick reply.  I tried

self.lines[0][0].set_data((self.data.xa,self.data.ya))
self.lines[0][1].set_data((self.data.xa,self.data.ys))

but got the error 'list index out of range' after the second 
statement.  I also tried

self.lines[0][0].set_data((self.data.xa,self.data.ya))
self.lines[1][0].set_data((self.data.xa,self.data.ys))

There were no errors in this case but the data does not plot 
correctly.  Finally, I tried

self.lines[0][0].set_xdata(self.data.xa)
self.lines[0][0].set_ydata(self.data.ya)
self.lines[1][0].set_xdata(self.data.xa)
self.lines[1][0].set_ydata(self.data.ys)

but matplotlib complained that 'xdata and ydata must be the same 
length'  after executing the first of these statements (presumably 
because the new xa array has a different number of elements than the 
old ya array)

At 13:05 25/06/2008, you wrote:

>Hi Alun,
>
>On Wednesday 25 June 2008 07:09:52 am eShopping wrote:
> > Hi
> >
> > the following code snippet is from a simple wxpython/matplotlib app
> >
> > # Data object class
> >
> > class PlotData(object):
> >
> >      # Constructor (dummy arrays)
> >
> >      def __init__(self):
> >          self.np = 100
> >
> >          self.xa = numpy.arange(100.0)
> >          self.ya = 2.0 * self.xa
> >          self.ys = 4.0 * self.xa
> >
> >
> > # Plot window class
> >
> > class PlotWin(object):
> >      def __init__(self, data):
> >          self.data = data            # Store reference to data object
> >          self.figure = Figure()      # Initialise figure
> >
> >          # Create an Axes object to plot on
> >
> >          self.ax1 = self.figure.gca()
> >          self.ax1.yaxis.tick_left()
> >          self.ax1.xaxis.tick_bottom()
> >
> >          # Plot the data
> >
> >          self.lines=[]
> >
> >          self.lines.append(self.ax1.plot(self.data.xa, self.data.ya, 'g'))
> >          self.lines.append(self.ax1.plot(self.data.xa, self.data.ys, '-r'))
> >
> >
> >      # Update plot with new data
> >
> >      def RefreshPlot(self, data):
> >          self.lines[0].set_data((self.data.xa,self.data.ya))
> >          self.lines[1].set_data((self.data.xa,self.data.ys))
> >
> >          self.canvas.draw()
> >
> >
> > # Main program
> >
> > if __name__ == "__main__":
> >      data = PlotData()
> >      pwin = PlotWin(data)
> >      pwin.RefreshPlot(data)
> >
> > The plot data changes during the application and I just want to
> > replace the existing data with the new data (which may have a
> > different number of points compared to the old data).  I get the
> > Python error "'list' object has no attribute 'set_data'" when the
> > code executes RefreshPlot().  AFAIK lines[0] and lines[1] are
> > 'Line2D' objects (at least that's what Python says they are when I
> > ask to have them printed) , which do have a 'set_data' method.  I'm
> > sure there's something really easy that I need to do but just can't
> > see it - all suggestions gratefully received!
>
>I think the problem is:
>
>self.lines.append(self.ax1.plot(self.data.xa, self.data.ya, 'g'))
>
>plot() returns a list of lines. You are appending that list to self.lines, so
>when you index self.lines[0] later, you are getting the list returned by
>plot. You should either use extend() instead of append, or you need to index
>deeper: self.lines[0][0] and self.lines[0][1].
>
>Darren


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to