2015-10-26 46 views
0

我在結合wxPython和matplotlib的應用程序上苦苦掙扎。wxpython面板中的matplotlib動畫

我想在wxPanel中嵌入一個動畫matplotlib對象。數據應該在運行時添加。

我的模塊代碼:

(我不能得到正確的格式,見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() 

林現在struggeling上增加更多詳細信息以圖形,如彩條或標題。

如果我在anim_Fkt中添加self.subplot.title = 'test',我會得到''str'對象沒有'get_animated'屬性。如果我嘗試plt.title('test'),則不起作用。 什麼是添加標題或顏色條或圖例的正確方法?

回答

0

要將特徵添加到嵌入式matplotlib圖中,您必須使用面向對象的matplotlib API。 matplotlib圖由一個圖(一個matplotlib.figure.Figure實例)組成,其中有一個或多個軸(matplotlib.axes.Axes實例)。它們中的每一個都包含Drawables(線條,圖像,散點圖等)。

甲標題可以被添加(或修改)的Figure或每個Axes與setter方法,如Figure.suptitleAxes.set_title(或者,在你的情況下,或self.figure.suptitle()self.subplot.set_title)。

顏色條有點麻煩,因爲它需要創建一個數據對象(可映射):我們只能在anim函數中創建它。另外,我不想創建多個colorbar實例;一旦創建,我們只需要更新它。實現這一目標很簡單:實例化self.colorbar與構造None,然後檢查其對None在動畫功能:如果是None,然後創建彩條,如果不是,則更新:

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 
+0

謝謝,在兩者之間我通過很多嘗試和錯誤循環來解決它:我對名稱感到困惑(爲什麼我使用'add_SUBPLOT'來添加名爲'axes'的東西?)。我在「axes」文檔中找到了'set_title'(與「axis」不一樣,對於非本地英語讀者而言,這很困惑)。我還發現'update_normal()',只要你不更改'pcolor' /'pcolormesh'的'vmin' /'vmax',它就會工作。如果您更改範圍或色彩集,則需要'update_bruteforce()'使其更新色彩條。但感謝您的幫助,將其標記爲解決方案:) – xavor