We are on the Home strech and NEED help

Me and my team are almost to the finishing point. Our final problem is
getting the graph to update.

When we run the graph the get the following issue: "
Traceback (most recent call last):
  File "/home/gnelson/scc08whole/branch/realistic2d/gtkgui.py", line 100, in
update
    self.ax.draw_artist(plt.contourf)
  File "/usr/lib/python2.5/site-packages/matplotlib/axes.py", line 1535, in
draw_artist
    a.draw(self._cachedRenderer)
AttributeError: 'function' object has no attribute 'draw'"

Our Code is at: " http://code.google.com/p/scc08/ "

and we are using the gtkgui.py

import time
import gtk, gobject
import matplotlib
matplotlib.use('GTKAgg')
import matplotlib.pyplot as plt
from driver import Driver

import numpy as np

class Gui:

    def updateData(self):
        self.updateTemps()
        self.getMats()
        self.addTimeSteps()
        self.getAirPts()
        self.getGroundPts()
        self.getBridgePts()

    def updateTemps(self):
        self.temps = []
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            self.temps.append([])
            for j in range(len(temp[i])):
                self.temps[i].append(temp[i][j].temperature)

    def getMats(self):
        self.mats = []
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            self.mats.append([])
            for j in range(len(temp[i])):
                self.mats[i].append(temp[i][j].density)
        self.mats

    def setUserInput(self):
        str = raw_input("What do you want: Ground or Air? (The default is
air) \n")
        if(str == "Ground" or str == "ground"):
            self.type = 1
        else:
            self.type = 2

    def getAirPts(self):
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            for j in range(len(temp[i])):
                if(temp[i][j].material == 'air'):
                    self.airData.append(temp[i][j].temperature)
                    return

    def getBridgePts(self):
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            for j in range(len(temp[i])):
                if(temp[i][j].material == 'concrete'):
                    self.bridgeData.append(temp[i][j].temperature)
                    return

    def getGroundPts(self):
        if (type == 1):
            return None
        else:
            temp = self.dr.myGrid.fields
            for i in range(len(temp)):
                for j in range(len(temp[i])):
                    if(temp[i][j].material == 'soil'):
                        self.groundData.append(temp[i][j].temperature)
                        return

    def addTimeSteps(self):
        self.time.append(self.step)

    def update(self, *args):
        print "WTF Delta?!?"
        self.step = 0
        if self.background is None:
            self.background = self.canvas.copy_from_bbox(self.ax.bbox)
        self.updateData()
        # restore the clean slate background
        self.canvas.restore_region(self.background)
        # update the data
        print "GROUND DATA:"
        print len(self.groundData)
        print "TIME DATA"
        print len(self.time)
        if(self.type != 2):
            self.groundLine = self.ax.plot(self.groundData , self.time,
'g-+')
            self.bridgeLine = self.ax.plot(self.bridgeData , self.time,
'r-o')
            self.airLine = self.ax.plot(self.airData, self.time, 'b-s')

        self.contour = self.ax2.contourf(self.temps)
        self.colorbar = self.fig.colorbar(self.contour)
        # just draw the animated artist
        self.ax.draw_artist(self.groundLine)
        self.ax.draw_artist(self.airLine)
        self.ax.draw_artist(self.bridgeLine)
        self.ax.draw_artist(plt.contourf)
# self.ax.draw_artist(colorbar)
        # just redraw the axes rectangle
        self.canvas.blit(self.ax.bbox)

        self.cnt += 1
        self.step += .004
        self.dr.run(10)
        self.time.append(self.step*10)
        return True

    update.cnt = 0
    update.background = None

    def setup(self):
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(211)
        self.ax2 = self.fig.add_subplot(212)
        self.canvas = self.fig.canvas
        self.ax.grid() # to ensure proper background restore
        self.canvas.draw()
        # create some globals
        self.airData = []
        self.groundData = []
        self.bridgeData = []
        self.time = []
        self.step = 0
        self.setUserInput()
        self.temps = []
        self.mats = []
        self.dr = Driver(.5, .5, 0.0004, type, (7,7,9,9), (16,16))
        self.cnt = 0
        self.background = None
         # don't use time steps over 4 * 10 ** -4
        self.updateTemps()
        self.gmats = self.getMats()
        # create the initial graphs
        self.contour = self.ax2.contourf(self.temps)
        self.colorbar = self.fig.colorbar(self.contour)
        self.groundLine, = self.ax.plot(self.groundData , self.time, 'g-+')
        self.bridgeLine, = self.ax.plot(self.bridgeData , self.time, 'r-o')
        self.airLine, = self.ax.plot(self.airData , self.time, 'b-s')
        
if __name__ == "__main__":
    mygui = Gui()

    def start_anim(event):
        gobject.idle_add(mygui.update)
        mygui.canvas.mpl_disconnect(start_anim.cid)
        
    mygui.setup()
    start_anim.cid = mygui.canvas.mpl_connect('draw_event', start_anim)
    plt.show()

···

--
View this message in context: http://www.nabble.com/We-are-on-the-Home-strech-and-NEED-help-tp22795527p22795527.html
Sent from the matplotlib - users mailing list archive at Nabble.com.

Hello,

I'm not familiar with the draw_artist functionality, but for me there seems
to to be the following replacement needed (due to a typo):

self.ax.draw_artist(plt.contourf) -> self.ax.draw_artist(self.contour)

because otherwise you are trying to draw a matplotlib function, which seems to
be not reasonable and explains the error, because this function has no
attribute 'draw'.

Good luck.
best regards Matthias

···

On Tuesday 31 March 2009 01:45:28 Deltarodigy wrote:

Me and my team are almost to the finishing point. Our final problem is
getting the graph to update.

When we run the graph the get the following issue: "
Traceback (most recent call last):
  File "/home/gnelson/scc08whole/branch/realistic2d/gtkgui.py", line 100,
in update
    self.ax.draw_artist(plt.contourf)
  File "/usr/lib/python2.5/site-packages/matplotlib/axes.py", line 1535, in
draw_artist
    a.draw(self._cachedRenderer)
AttributeError: 'function' object has no attribute 'draw'"

Our Code is at: " http://code.google.com/p/scc08/ "

and we are using the gtkgui.py

import time
import gtk, gobject
import matplotlib
matplotlib.use('GTKAgg')
import matplotlib.pyplot as plt
from driver import Driver

import numpy as np

class Gui:

    def updateData(self):
        self.updateTemps()
        self.getMats()
        self.addTimeSteps()
        self.getAirPts()
        self.getGroundPts()
        self.getBridgePts()

    def updateTemps(self):
        self.temps = []
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            self.temps.append([])
            for j in range(len(temp[i])):
                self.temps[i].append(temp[i][j].temperature)

    def getMats(self):
        self.mats = []
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            self.mats.append([])
            for j in range(len(temp[i])):
                self.mats[i].append(temp[i][j].density)
        self.mats

    def setUserInput(self):
        str = raw_input("What do you want: Ground or Air? (The default is
air) \n")
        if(str == "Ground" or str == "ground"):
            self.type = 1
        else:
            self.type = 2

    def getAirPts(self):
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            for j in range(len(temp[i])):
                if(temp[i][j].material == 'air'):
                    self.airData.append(temp[i][j].temperature)
                    return

    def getBridgePts(self):
        temp = self.dr.myGrid.fields
        for i in range(len(temp)):
            for j in range(len(temp[i])):
                if(temp[i][j].material == 'concrete'):
                    self.bridgeData.append(temp[i][j].temperature)
                    return

    def getGroundPts(self):
        if (type == 1):
            return None
        else:
            temp = self.dr.myGrid.fields
            for i in range(len(temp)):
                for j in range(len(temp[i])):
                    if(temp[i][j].material == 'soil'):
                        self.groundData.append(temp[i][j].temperature)
                        return

    def addTimeSteps(self):
        self.time.append(self.step)

    def update(self, *args):
        print "WTF Delta?!?"
        self.step = 0
        if self.background is None:
            self.background = self.canvas.copy_from_bbox(self.ax.bbox)
        self.updateData()
        # restore the clean slate background
        self.canvas.restore_region(self.background)
        # update the data
        print "GROUND DATA:"
        print len(self.groundData)
        print "TIME DATA"
        print len(self.time)
        if(self.type != 2):
            self.groundLine = self.ax.plot(self.groundData , self.time,
'g-+')
            self.bridgeLine = self.ax.plot(self.bridgeData , self.time,
'r-o')
            self.airLine = self.ax.plot(self.airData, self.time, 'b-s')

        self.contour = self.ax2.contourf(self.temps)
        self.colorbar = self.fig.colorbar(self.contour)
        # just draw the animated artist
        self.ax.draw_artist(self.groundLine)
        self.ax.draw_artist(self.airLine)
        self.ax.draw_artist(self.bridgeLine)
        self.ax.draw_artist(plt.contourf)
# self.ax.draw_artist(colorbar)
        # just redraw the axes rectangle
        self.canvas.blit(self.ax.bbox)

        self.cnt += 1
        self.step += .004
        self.dr.run(10)
        self.time.append(self.step*10)
        return True

    update.cnt = 0
    update.background = None

    def setup(self):
        self.fig = plt.figure()
        self.ax = self.fig.add_subplot(211)
        self.ax2 = self.fig.add_subplot(212)
        self.canvas = self.fig.canvas
        self.ax.grid() # to ensure proper background restore
        self.canvas.draw()
        # create some globals
        self.airData = []
        self.groundData = []
        self.bridgeData = []
        self.time = []
        self.step = 0
        self.setUserInput()
        self.temps = []
        self.mats = []
        self.dr = Driver(.5, .5, 0.0004, type, (7,7,9,9), (16,16))
        self.cnt = 0
        self.background = None
         # don't use time steps over 4 * 10 ** -4
        self.updateTemps()
        self.gmats = self.getMats()
        # create the initial graphs
        self.contour = self.ax2.contourf(self.temps)
        self.colorbar = self.fig.colorbar(self.contour)
        self.groundLine, = self.ax.plot(self.groundData , self.time, 'g-+')
        self.bridgeLine, = self.ax.plot(self.bridgeData , self.time, 'r-o')
        self.airLine, = self.ax.plot(self.airData , self.time, 'b-s')

if __name__ == "__main__":
    mygui = Gui()

    def start_anim(event):
        gobject.idle_add(mygui.update)
        mygui.canvas.mpl_disconnect(start_anim.cid)

    mygui.setup()
    start_anim.cid = mygui.canvas.mpl_connect('draw_event', start_anim)
    plt.show()

Yes, that looks like the problem, but not the solution. self.contour
is the return value of ax.contourf, which is a ContourSet.
Unfortunately, the matplotlib.contour documentation has not yet been
ported to the sphinx/rest doc system (Eric, hint, hint). But you can
read the docs in the source of matplotlib/contour.py or in the python
shell with help matplotlib.countour.ContourSet. To do what it looks
like you are trying to do, if you want to force a draw on the contour
artists (which are matplotlib.collection.Collection instances), you
would do

  self.contour = ax.contourf(...)
  for col in self.contour.collections:
    ax.draw_artist(col)

JDH

···

On Tue, Mar 31, 2009 at 3:33 AM, Matthias Michler <MatthiasMichler@...361...> wrote:

Hello,

I'm not familiar with the draw_artist functionality, but for me there seems
to to be the following replacement needed (due to a typo):

self.ax.draw_artist(plt.contourf) -> self.ax.draw_artist(self.contour)

because otherwise you are trying to draw a matplotlib function, which seems to
be not reasonable and explains the error, because this function has no
attribute 'draw'.