简体   繁体   中英

matplotlib animation in wxpython panel

I'm struggling on an application combining wxPython and matplotlib.

I want to embed an animated matplotlib object in an wxPanel. The Data should be added on runtime.

My Module Code:

(i cant get the correct formatting, see http://pastebin.com/PU5QFEzG )

'''
a panel to display a given set of data in a wxframe as a heatmap, using pcolor
from the matplotlib

@author: me
'''
import wx
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas #todo: OW 26.10.15 needed?

class plotPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.figure = plt.Figure()
        self.subplot = self.figure.add_subplot(111)
        plt.title('test')
        self.canvas = FigureCanvas(self, -1, self.figure)  #ToDo: OW 26.10.15 Verstehen
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.SetSizer(self.sizer)
        self.Fit()
        self.dataSet = []
        self.animator = animation.FuncAnimation(self.figure,self.anim, interval=1000)

    def anim(self, a):
        if(len(self.dataSet) == 0):
            return 0
        i = a % len(self.dataSet)
        obj = self.subplot.pcolor(self.dataSet[i], cmap='RdBu')
        return obj

    def add_data(self, data):
        self.dataSet.append(data)


#
#    Code for a standalone test run
#
class TestFrame(wx.Frame):
    def __init__(self,parent,title):
        wx.Frame.__init__(self,parent,title=title,size=(1000,1000))
        self.statusbar = self.CreateStatusBar()
        self.statusbar.SetStatusText('Status Bar')


if __name__ == '__main__':
    from numpy.random import rand #todo: OW 26.10.15 remove
    app = wx.App(redirect=False)
    frame = TestFrame(None, 'Debug Frame')
    panel = plotPanel(frame)
    frame.Show()
    C = rand(10,10)
    panel.add_data(C)
    C = rand(10,10)
    panel.add_data(C)
    C = rand(10,10)
    panel.add_data(C)
    app.MainLoop()

Im now struggeling on adding more Details to the Graph, eg a colorbar or a title.

If I add self.subplot.title = 'test' in the anim_Fkt, i get "'str' object has no attribute 'get_animated'". If i try plt.title('test') , it has no effect. Whats the correct way to add a title or a colorbar or a legend?

To add the features to an embedded matplotlib graph, you have to use object-oriented matplotlib API. A matplotlib graph consists of a figure (a matplotlib.figure.Figure instance), which has one or several axes ( matplotlib.axes.Axes instances) in it. Each of them, in their turn, contains Drawables (lines, images, scatter plots etc).

A title can be added (or modified) to the Figure or to each Axes with setter methods, such as Figure.suptitle or Axes.set_title (or, in your case, self.figure.suptitle() or self.subplot.set_title ).

The colorbar is a little bit trickier, as it needs a data object (a mappable) to be created: we can create it only in the anim function. Also, wo do not want to create many colorbar instances; once created, we only need to update it. Achieving that is easy: instantiate self.colorbar with None in constructor, and then check it against None in animation function: if it is None , then create colorbar, if it is not, then update it:

class plotPanel(wx.Panel):
    def __init__(self, parent):
        ...
        self.colorbar = None

    def anim(self, a):
        ...
        self.subplot.set_title("Frame %i" % a)
        if self.colorbar is None:
            self.colorbar = self.figure.colorbar(obj)
        else:
            self.colorbar.update_normal(obj)
        self.colorbar.update_normal(obj)
        return obj

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM